web-dev-qa-db-ja.com

go modを使用するときにベンダーにローカル依存関係を追加する方法

以前はgo depを使用していましたが、現在は公式ツールがgo modであることを確認してください。

go depを使用すると、ローカルの依存関係パッケージをベンダーに追加し、ignoredGopkg.tomlに追加して無視できますリポジトリからパッケージを検索します。 go dep updateは正常に実行できます。

ここでgo modを使用します。ローカル依存パッケージをベンダーに追加し、excludego.modに追加します。しかし、go mod tidyを実行すると、プロジェクトがimport xxxであってもパッケージが削除されます。

私は何をしましたか:

  1. 新しいプロジェクトを作成する
  2. go mod initを実行します
  3. go.modexclude privaterepo.com/bb/bbを変更します

  4. ローカルモジュールはhttpsをサポートしないプライベートリポジトリにあるため、ローカルモジュールをベンダーにコピーします。

  5. 今のようなベンダー:

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

  6. 「privaterepo.com/bb/bb」をインポート
  7. go build -mod vendorを実行します
  8. エラーが発生しました "パスのモジュールが見つかりませんprivaterepo.com/bb/bb"9常に置換を試みますが、機能しません

それで、local packageをベンダーに追加してgo modを削除しないようにするにはどうすればよいですか?

3
yanyandenuonuo

では、ローカルパッケージをベンダーに追加し、modを削除しないようにするにはどうすればよいですか?

まあ、これはできないと思います。これは、それがどのように機能するかではありません。 go mod vendormanagesベンダーフォルダ。

Go.modからパッケージをexcludeingする代わりに、replaceディレクティブを追加して、goreツールにprivaterepo.comではなくローカルファイルシステムからパッケージを検索するように指示する必要があります。 https://github.com/golang/go/wiki/Modules#when-should-i-use-the-replace-directive からの引用

replaceは、次のようなマルチモジュールプロジェクト内のモジュールのディスク上の相対位置または絶対位置を移動ツールに通知するためにも使用できます。

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

だからあなたの場合:ベンダーにprivaterepo.com/bb/bbを手動で入れようとしないでください、しかしそれを現在のプロジェクトの外のどこかに持って使ってください

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

そして、go modこれをファイルシステムからベンダーにコピーします。

5
Volker

数十 of SO投稿、ブログなど)を試した後、everyメソッドを試しましたが、これは何ですか思いついたすべてのものをカバーしています。

The Vanilla DevOps Git Credentials&Private Packages Cheatsheet

これらは、gitを安全に認証してリポジトリを複製するすべての方法とツールですインタラクティブなパスワードプロンプトなし

  • SSH公開鍵
    • SSH_ASKPASS
  • APIアクセストークン
    • GIT_ASKPASS
    • .gitconfigの代わりに
    • .gitconfig [資格情報]
    • .git-credentials
    • .netrc
  • プライベートパッケージ(無料)
    • node/npm package.json
    • python/pip/eggs requirements.txt
    • Ruby gems Gemfile
    • golang go.mod

銀の弾丸

Just Works™が必要ですか?これは魔法の銀の弾です。

アクセストークンを取得し(GithubまたはGiteaの手順が必要な場合は、チートシートのセクションを参照してください)、環境変数に設定します(ローカル開発とデプロイメントの両方)。

MY_GIT_TOKEN=xxxxxxxxxxxxxxxx

Githubの場合、次の行をコピーして実行しますverbatim

git config --global url."https://api:[email protected]/".insteadOf "https://github.com/"
git config --global url."https://ssh:[email protected]/".insteadOf "ssh://[email protected]/"
git config --global url."https://git:[email protected]/".insteadOf "[email protected]:"

おめでとうございます。今や、自動化ツールのgitリポジトリのクローン作成は、httpsを使用する場合でも、ssh urlのいずれかのスタイルを使用する場合でも、パスワードプロンプトによって妨げられません。

Githubを使用していませんか?

他のプラットフォーム(Gitea、Github、Bitbucket)の場合は、URLを変更するだけです。ユーザー名は変更しないでください(任意ですが、個別の構成エントリに必要です)。

互換性

これはMacOS、Linux、Windows(Bashの場合)、Docker、CircleCI、Heroku、Akkerisなどでローカルに動作します。

詳細

チートシートの「.gitconfigの代わりに」セクションを参照してください。

セキュリティ

チートシートの「セキュリティ」セクションをご覧ください。 Dockerなどの「AskPass」メソッドを好む人もいます。Dockerホストを信頼しない場合や、Dockerイメージを公開しない場合に不可欠です。

0
CoolAJ86