保持一致的gemfile.lock,用于具有天然扩展的宝石



我在一个工程师团队中工作,该工程师会开发具有本机可执行文件的宝石。出于合同原因,重要的是,当我们部署到新环境中时,所有依赖项都会使用与我们测试的相同的确切版本。Gemfile只能维护一阶依赖性版本,而不是递归版本。因此,我们从历史上一直将Lockfile检查到GitHub中,但这阻止了我们自1.14版本以来就无法升级Bundler。问题在于,我们拥有OSX和Linux的开发机,并且从1.14开始,GEM存储库中Lockfile的开头从:

中更改为:
PATH
  remote: .
  specs:
    engine (21.2.13)
      <gemspec dependencies here>

to

PATH
  remote: .
  specs:
    engine (21.2.13-x86_64-linux)
      <gemspec dependencies here>

这是一个问题,因为当开发人员在OSX上拉动储备并运行bundle install时,它将更改锁定文件的内容。然后,当Linux开发人员执行相同的操作时,它将再次改变,在Lockfile的GIT历史上创建一堆虚假的变化!

我尝试运行bundle lock --add-platform x86_64-linuxbundle lock --add-platform x86_64-darwin,希望这能说服Bundler对不同平台维护两个条目,而不是在它们之间进行翻译。 did 为Lockfile的GEM部分中的某些宝石产生了重复条目,但对于PATHn specs:部分中的一部分。

目前,我们的gemfile包含以下行:

gemspec name: "engine"

加载engine.gemspec。此文件包含:

Gem::Specification.new do |spec|
  ...
  spec.platform = Gem::Platform::CURRENT
  ...
end

我怀疑是问题所在。我尝试了Gemfile中的GemSpec 两次,并使用全局变量指定使用的平台,但是Bundler仅在第一次尝试时才加载它,然后跳过第二次尝试。

有人知道一个解决方案,该解决方案将使我们能够将两个特定于平台的宝石版本保留在同一锁紧file中?

或其他方式,是否有一种方法可以关闭将平台名称附加到GEM版本的新型行为?过去,当Lockfile简单地指定" 21.2.13",而我们的Gemserver包含每个版本的两个副本(为两个平台构建的二进制文件)时,Bundler从来没有任何解决当前机器的正确版本的问题,所以这似乎是就像存储多余信息的LockFile一样。我可以以某种方式告诉它停止吗?

我曾经多样地听到,既建议又推荐将您的锁定器用于版本控制,但从未完全理解原因。这似乎是问题的根源!

我最常看到的建议(尽管这可能不是总是可能的),这是锁紧file绝不应在GEM的版本控制下,而应始终用于独立应用程序。这个想法是,宝石旨在便携,因此其依赖性应该具有一定的灵活性。重要的是,这种灵活性不能阻止我们的开发环境保持一致,前提是所有测试不是在宝石存储库中,而是在使用GEM的独立应用程序的存储库中。

独立应用程序的锁定文件已经跟踪我们认为我们正在使用Gem的Lockfile跟踪的依赖项,并且当应用程序部署时,所有GEM的依赖项都固定在应用程序中,而不是在GEM内部。

。 。

Gemfile.lock的"规格"部分应仅以GEM回购中存在,而本节以依赖平台的方式名称GEM并不是问题,因为宝石是由无独立的名称所指的在应用程序的锁定文件中。

相关内容

  • 没有找到相关文章

最新更新