私は、ネイティブ実行可能ファイルを使用して gem を開発するエンジニアのチームで働いています。契約上の理由から、新しい環境にデプロイするときは、すべての依存関係でテストしたものとまったく同じバージョンを使用することが重要です。はGemfile
、再帰バージョンではなく、一次依存バージョンのみを維持できます。このため、歴史的にロックファイルを github にチェックインしたままにしてきましたが、これにより 1.14 リリース以降、バンドラーをアップグレードできなくなりました。問題は、OSX と Linux の両方の開発マシンがあり、1.14 以降、gem リポジトリのロックファイルの先頭が次から変更されたことです。
PATH
remote: .
specs:
engine (21.2.13)
<gemspec dependencies here>
に
PATH
remote: .
specs:
engine (21.2.13-x86_64-linux)
<gemspec dependencies here>
開発者が OSX でレポをプルして実行bundle install
すると、ロックファイルの内容が変更されるため、これは問題です。次に、Linux 開発者が同じことをすると、ロックファイルの git 履歴に大量の誤った変更が作成され、すべてが再び変更されます。
bundle lock --add-platform x86_64-linux
andを実行してみbundle lock --add-platform x86_64-darwin
ました。これにより、バンドラーが異なるプラットフォームの 2 つのエントリを保持するようになることを期待して、それらの間でフリップフロップを実行するのではありません。ロックファイルのセクションにあるいくつかの gem では重複したエントリが生成されましたが、セクション内のエントリでは生成されませんでした。GEM
PATH\n
specs:
現在、Gemfile には次の行が含まれています。
gemspec name: "engine"
ロードしますengine.gemspec
。このファイルには以下が含まれます。
Gem::Specification.new do |spec|
...
spec.platform = Gem::Platform::CURRENT
...
end
これが問題だと思います。Gemfile に gemspec を2 回含め、グローバル変数を使用して使用するプラットフォームを指定しようとしましたが、バンドラーはそれを最初にロードするだけで、2 回目の試行をスキップします。
プラットフォーム固有の両方の gem バージョンを同じロックファイルに保持できるようにするソリューションを知っている人はいますか?
または、プラットフォーム名をgemバージョンに追加するバンドラーの新しい動作をオフにする方法はありますか? 以前は、ロックファイルが単純に「21.2.13」を指定し、gemserver に各バージョンの 2 つのコピー (2 つのプラットフォーム用にビルドされたバイナリを含む) が含まれていた場合、バンドラーは現在のマシンの正しいバージョンを解決する問題をまったく抱えていなかったので、これはどうやら余分な情報を保存するロックファイルのように。どうにかしてやめるように言うことはできますか?