CircleCI 说在您的 Gemfile 中列出的任何源中都找不到您的包

Posted

技术标签:

【中文标题】CircleCI 说在您的 Gemfile 中列出的任何源中都找不到您的包【英文标题】:CircleCI says Your bundle could not be found in any of the sources listed in your Gemfile 【发布时间】:2021-04-03 04:46:32 【问题描述】:

CircleCI 安装依赖错误:

Your bundle is locked to my_cool_gem (0.7.2), but that version could not be
found in any of the sources listed in your Gemfile. If you haven't changed
sources, that means the author of my_cool_gem (0.7.2) has removed it. You'll
need to update your bundle to a version other than my_cool_gem (0.7.2) that
hasn't been removed in order to install.

CircleCI 输出截图:

CircleCI 找不到我发布到 GitHub Packages 的 gem,但我在本地开发中没有这样的问题。

我有 RubyGems 和 Bundler 的合格版本,根据 GitHub 的文档 - https://docs.github.com/en/free-pro-team@latest/packages/guides/configuring-rubygems-for-use-with-github-packages - 我相信我已按照说明发布和使用所述已发布的 gem...再次,使用工作 本地但在 CircleCI...

中失败

RubyGems 版本:

-bash> gem --version
3.0.9

捆绑器版本:

-bash> bundle --version
Bundler version 1.17.3

宝石文件:

source 'https://rubygems.org'                                                   
source 'https://rubygems.pkg.github.com/my_cool_org'

gem 'my_cool_gem', '0.7.2'

请注意,我也尝试过:

source 'https://rubygems.org'                                                   
source 'https://rubygems.pkg.github.com/my_cool_org'

source 'https://rubygems.pkg.github.com/my_cool_org' do
  gem 'my_cool_gem', '0.7.2'
end

【问题讨论】:

我真的只是想要一个答案(来自任何人)——我不关心“有信誉的来源”——我想下次我会选择“提请注意这个问题”。对不起! 【参考方案1】:

尝试运行bundle update my_cool_gem,如果它修改了应该修复它的Gemfile.lock

【讨论】:

感谢您对我的帮助。不幸的是bundle update 没有效果(没有文件被更改)。我怀疑这个结果,因为我已经运行了bundle install 并提交了对GemfileGemfile.lock 的更改(因为我将gem 从0.7.1 更新为0.7.2 以尝试调试情况。我不知所措更多的东西可以尝试。再次感谢。 在本地它什么都不做(锁文件没有变化)。在 CI 上,它显示错误:Unable to find a spec satisfying my_cool_gem (~> 2.0) in the set. Perhaps the lockfile is corrupted?【参考方案2】:

您是否验证过它实际上仍然可以从源头获取?我知道您说它可以在本地工作,但这可能是因为 gem 的本地缓存版本。 Bundle 不会尝试安装已经存在的东西。

您可以通过在本地卸载它并再次运行 bundle install 来验证这一点。

【讨论】:

感谢您帮助我。是的,我已验证 gem 在源头可用。它列在 https://github.com/orgs/my_cool_org/packages 中(我将 URL 格式化为代码,因为我不希望它变成链接,因为我使用的是 my_cool_gem 存根)。【参考方案3】:

确保您已正确设置环境变量以使用rubygems.pkg.github.com 进行身份验证。

(虽然可以设置变量,但值可能不正确 - 就像我的情况一样。)

【讨论】:

在这种情况下我收到Bad username or password for … 错误。 如果未设置密码(删除~/.bundle/config),则错误为Authentication is required for rubygems.pkg.github.com。所以这不太可能是原因。 该密钥很可能是有效,但它没有对该存储库的权限。尽管每个组织只有一个注册表 URL,但 Github 将每个存储库中的 gem 分开。【参考方案4】:

有趣,听起来像一个图像错误。如果您尝试列出所有可用版本的 gem,会发生什么? gem search ^gem_name$ --all?

您是否尝试过提前强制更新? sudo gem update --system

【讨论】:

谢谢,但我碰巧已经弄清楚了——根据我上面的回答......虽然变量已设置,但它是无效的(我相信是因为创建身份验证令牌的用户有已从组织中删除)。 对我来说,gem search--all 只搜索 ruby​​gems.org,所以在本地(bundle install 工作的地方)和 CI(不工作的地方)都没有那个 gem。 sudo gem update --system 没有帮助。【参考方案5】:

对我来说,问题在于本地机器和 CI 上的访问令牌不同。并且 CI 上的密钥是有效的,但它对包含请求的 gem 的特定存储库没有权限。

尽管 Github 为每个组织提供单一注册表,但 gem 与公司的存储库相关联。并且注册表中的包将是可见或不可见的,具体取决于访问令牌所具有的这些存储库的权限。例如,用户可以访问组织的某些存储库,而不必访问其他存储库——如果使用该用户的个人访问令牌,则只有与允许的存储库关联的 gem 可见。其他的会被隐藏,所以错误是“找不到那个版本”。

【讨论】:

【参考方案6】:

又遇到了这个问题,这次我无法用the solution I used last time 解决它,也没有其他解决方案有效,所以我选择通过放置一个副本来临时解决这个问题将有问题的 gem 直接导入我的应用程序(称为“供应商”的过程;请参阅 this、this 和 this):

gem unpack my_cool_gem # note, I actually had to specify the version with -v 0.12.1

mkdir vendor/gems/

mv my_cool_gem-0.12.1 vendor/gems/

Gemfile 中,使用the :path option 而不是:source

gem 'my_cool_gem', '0.12.1', path: 'vendor/gems'

然后生成Gemfile.lock:

bundle install

【讨论】:

以上是关于CircleCI 说在您的 Gemfile 中列出的任何源中都找不到您的包的主要内容,如果未能解决你的问题,请参考以下文章

在您的 Gemfile 中列出的或本机上可用的任何 gem 源中找不到 gem 'wdm (>= 0.1.0) x64-mingw32'

从控制台获取 rails 关联

如何在我的 Gemfile 中找到未使用的宝石

您的 Ruby 版本是 2.0.0,但您的 Gemfile 指定了 2.1.0

当您的 Gemfile 需要旧版本的捆绑器时,如何“捆绑安装”?

在 Gemfile 和 .ruby-version Dotfile 中列出 Ruby 版本是一种不好的做法吗?