How to add local dependency to vendor when using go mod

19,027

So, what should I do to add local package to vendor and avoid go mod remove it?

Well, I think you cannot do this. This is not how it works. go mod vendor manages your vendor folder.

Instead of excludeing you package from go.mod you should add a replace directive to instruct the go tool to look up the package not from privaterepo.com but from the local filesystem. Quoting from https://github.com/golang/go/wiki/Modules#when-should-i-use-the-replace-directive

replace also can be used to inform the go tooling of the relative or absolute on-disk location of modules in a multi-module project, such as:

   replace example.com/project/foo => ../foo

So in your case: Do not try to manually put privaterepo.com/bb/bb in vendor, but have it somewhere outside the current project and use

replace privaterepo.com/bb/bb => ../bb

And let go mod copy this stuff from the filesystem to your vendor.

Share:
19,027
Admin
Author by

Admin

Updated on July 02, 2022

Comments

  • Admin
    Admin almost 2 years

    Before I used go dep, but now office ensure the official tool is go mod.

    When I use go dep, I can add local dependency packages to vendor and ignored in Gopkg.toml to ignore search the package from repo. I can execute go dep update normally.

    Now I use go mod, I also add local dependence package to vendor and add it exclude in go.mod. But when i execute go mod tidy, it remove the package even though my project exist import xxx.

    What did i do:

    1. create new project
    2. execute go mod init
    3. modify go.mod exclude privaterepo.com/bb/bb

    4. copy my local module to vendor because the local module is on a private repo which not support https.

    5. now the vendor just like:

      vendor |-github.com/aa/aa |-privaterepo.com/bb/bb

    6. import "privaterepo.com/bb/bb"
    7. execute go build -mod vendor
    8. than i got error "cannot find module for path privaterepo.com/bb/bb" 9 always try with replace, but it also not work

    So, what should I do to add local package to vendor and avoid go mod remove it?

  • Admin
    Admin over 5 years
    I had read the modules wiki, and i known i can copy privaterepo.com/bb/bb to outside vendor folder, also if i do this i won't need to add replace privaterepo.com/bb/bb => ../bb in the go.mod. But what's the mean of exclude, when should i use exclude? I prefer manager my private repo in vendor just like other public repo.
  • Volker
    Volker over 5 years
    @yanyandenuonuo exclude is for excluding a specific version of a module if you know that this version is broken/doesn't work with our code. IN this case you can mark this version as excluded an go will not select this version during version selection. For the second part: If you manage your build with modules and go mod than you must adopt your workflow to go mod.
  • Admin
    Admin over 5 years
    May be i should ask the question at golang issue. I don't think exclude is for excluding a specific version because require already declare the version. Anyway, thank you so much for your answer.
  • Volker
    Volker over 5 years
    @yanyandenuonuo exclude is for excluding a single version from the set of possibles and require is to select a single fixed version. Have a second look at the documentation if unsure.
  • Admin
    Admin over 5 years
    Got it, but i don't think this is right things about exclude and i had create a issue about this. Thank you once again.