Package layout for Go projects using modules to track dependencies?











up vote
1
down vote

favorite












Go now provides modules for dependency management, and I'm a little bit confused as to how I should organize my projects.



In traditional $GOPATH mode, I would organize an application as follows:



├─ cmd/
| └─ myapp/
| └─ main.go
├─ otherstuff/
| └─ file.go
└─ README.md, etc.


This is what I see most projects on GitHub doing.



However, now that we have modules, I'm not sure where to put go.mod. Does it go in the project's root directory? Does it go in cmd/[whatever]/? Should I still be putting main.go in the cmd/[whatever] directory or should it be in the project's root directory now?










share|improve this question


















  • 3




    What is the relationship between cmd/myapp and otherstuff with regard to versioning? If they are always versioned together, than put go.mod in the root of the repo. If not, put go.mod in each package. This will require more effort to maintain. The path of least resistance is go.mod in root.
    – ThunderCat
    Nov 12 at 22:18















up vote
1
down vote

favorite












Go now provides modules for dependency management, and I'm a little bit confused as to how I should organize my projects.



In traditional $GOPATH mode, I would organize an application as follows:



├─ cmd/
| └─ myapp/
| └─ main.go
├─ otherstuff/
| └─ file.go
└─ README.md, etc.


This is what I see most projects on GitHub doing.



However, now that we have modules, I'm not sure where to put go.mod. Does it go in the project's root directory? Does it go in cmd/[whatever]/? Should I still be putting main.go in the cmd/[whatever] directory or should it be in the project's root directory now?










share|improve this question


















  • 3




    What is the relationship between cmd/myapp and otherstuff with regard to versioning? If they are always versioned together, than put go.mod in the root of the repo. If not, put go.mod in each package. This will require more effort to maintain. The path of least resistance is go.mod in root.
    – ThunderCat
    Nov 12 at 22:18













up vote
1
down vote

favorite









up vote
1
down vote

favorite











Go now provides modules for dependency management, and I'm a little bit confused as to how I should organize my projects.



In traditional $GOPATH mode, I would organize an application as follows:



├─ cmd/
| └─ myapp/
| └─ main.go
├─ otherstuff/
| └─ file.go
└─ README.md, etc.


This is what I see most projects on GitHub doing.



However, now that we have modules, I'm not sure where to put go.mod. Does it go in the project's root directory? Does it go in cmd/[whatever]/? Should I still be putting main.go in the cmd/[whatever] directory or should it be in the project's root directory now?










share|improve this question













Go now provides modules for dependency management, and I'm a little bit confused as to how I should organize my projects.



In traditional $GOPATH mode, I would organize an application as follows:



├─ cmd/
| └─ myapp/
| └─ main.go
├─ otherstuff/
| └─ file.go
└─ README.md, etc.


This is what I see most projects on GitHub doing.



However, now that we have modules, I'm not sure where to put go.mod. Does it go in the project's root directory? Does it go in cmd/[whatever]/? Should I still be putting main.go in the cmd/[whatever] directory or should it be in the project's root directory now?







go package






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 12 at 21:55









Nathan Osman

32.1k59212320




32.1k59212320








  • 3




    What is the relationship between cmd/myapp and otherstuff with regard to versioning? If they are always versioned together, than put go.mod in the root of the repo. If not, put go.mod in each package. This will require more effort to maintain. The path of least resistance is go.mod in root.
    – ThunderCat
    Nov 12 at 22:18














  • 3




    What is the relationship between cmd/myapp and otherstuff with regard to versioning? If they are always versioned together, than put go.mod in the root of the repo. If not, put go.mod in each package. This will require more effort to maintain. The path of least resistance is go.mod in root.
    – ThunderCat
    Nov 12 at 22:18








3




3




What is the relationship between cmd/myapp and otherstuff with regard to versioning? If they are always versioned together, than put go.mod in the root of the repo. If not, put go.mod in each package. This will require more effort to maintain. The path of least resistance is go.mod in root.
– ThunderCat
Nov 12 at 22:18




What is the relationship between cmd/myapp and otherstuff with regard to versioning? If they are always versioned together, than put go.mod in the root of the repo. If not, put go.mod in each package. This will require more effort to maintain. The path of least resistance is go.mod in root.
– ThunderCat
Nov 12 at 22:18












1 Answer
1






active

oldest

votes

















up vote
2
down vote













From the wiki:




A module is a collection of related Go packages that are versioned together as a single unit. Most often, a single version-control repository corresponds exactly to a single module, but alternatively, a single version-control repository can hold multiple modules.




So putting go.mod right next to .git (or equivalent for some other VCS) is almost always the right thing to do. You would only create multiple modules in a single repository if the code in each module is truly independent from the other modules, so that the version of one module does not effect the other modules in any way.






share|improve this answer





















    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














     

    draft saved


    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53270670%2fpackage-layout-for-go-projects-using-modules-to-track-dependencies%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes








    up vote
    2
    down vote













    From the wiki:




    A module is a collection of related Go packages that are versioned together as a single unit. Most often, a single version-control repository corresponds exactly to a single module, but alternatively, a single version-control repository can hold multiple modules.




    So putting go.mod right next to .git (or equivalent for some other VCS) is almost always the right thing to do. You would only create multiple modules in a single repository if the code in each module is truly independent from the other modules, so that the version of one module does not effect the other modules in any way.






    share|improve this answer

























      up vote
      2
      down vote













      From the wiki:




      A module is a collection of related Go packages that are versioned together as a single unit. Most often, a single version-control repository corresponds exactly to a single module, but alternatively, a single version-control repository can hold multiple modules.




      So putting go.mod right next to .git (or equivalent for some other VCS) is almost always the right thing to do. You would only create multiple modules in a single repository if the code in each module is truly independent from the other modules, so that the version of one module does not effect the other modules in any way.






      share|improve this answer























        up vote
        2
        down vote










        up vote
        2
        down vote









        From the wiki:




        A module is a collection of related Go packages that are versioned together as a single unit. Most often, a single version-control repository corresponds exactly to a single module, but alternatively, a single version-control repository can hold multiple modules.




        So putting go.mod right next to .git (or equivalent for some other VCS) is almost always the right thing to do. You would only create multiple modules in a single repository if the code in each module is truly independent from the other modules, so that the version of one module does not effect the other modules in any way.






        share|improve this answer












        From the wiki:




        A module is a collection of related Go packages that are versioned together as a single unit. Most often, a single version-control repository corresponds exactly to a single module, but alternatively, a single version-control repository can hold multiple modules.




        So putting go.mod right next to .git (or equivalent for some other VCS) is almost always the right thing to do. You would only create multiple modules in a single repository if the code in each module is truly independent from the other modules, so that the version of one module does not effect the other modules in any way.







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 13 at 0:38









        Peter

        14.9k42032




        14.9k42032






























             

            draft saved


            draft discarded



















































             


            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53270670%2fpackage-layout-for-go-projects-using-modules-to-track-dependencies%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            How to send String Array data to Server using php in android

            Title Spacing in Bjornstrup Chapter, Removing Chapter Number From Contents

            Is anime1.com a legal site for watching anime?