Package layout for Go projects using modules to track dependencies?












1














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 '18 at 22:18
















1














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 '18 at 22:18














1












1








1


1





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 '18 at 21:55









Nathan OsmanNathan Osman

32.5k60213320




32.5k60213320








  • 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 '18 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 '18 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 '18 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 '18 at 22:18












1 Answer
1






active

oldest

votes


















2














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',
    autoActivateHeartbeat: false,
    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









    2














    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


























      2














      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
























        2












        2








        2






        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 '18 at 0:38









        PeterPeter

        15.6k42232




        15.6k42232






























            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.





            Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


            Please pay close attention to the following guidance:


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            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







            這個網誌中的熱門文章

            Tangent Lines Diagram Along Smooth Curve

            Yusuf al-Mu'taman ibn Hud

            Zucchini