ruby-on-rails - 开发具有依赖关系的多个 Rails 插件

标签 ruby-on-rails ruby dependencies bundler ruby-on-rails-plugins

我开始在我正在开发的项目中构建一系列插件和引擎,我遇到了一个问题,即必须在主应用程序和插件的所有 Gemfile 中列出依赖项的路径/engines 如果我想让 rake 工作。

Rake 对于主应用程序工作正常,因为它的 Gemfile 列出了我想要的插件/引擎的相对路径,但是当一个插件/引擎依赖于另一个并且没有列出所有的相对路径时,使用 rake rdoc 我会收到如下错误(大概我会在尝试运行测试/虚拟应用程序/等时遇到同样的错误):

Bundler could not find compatible versions for gem "user":
  In Gemfile:
    auth (>= 0) ruby depends on
      user (>= 0) ruby
Could not find gem 'user (>= 0) ruby', which is required by gem 'auth (>= 0) ruby', in any of the sources.

我没有使用路径,而是尝试像这样在插件/引擎中指定 git 存储库:

# User engine
gem 'user', git: 'https://localhost/git/project/user.git', branch: 'master'

然后使用bundler config local.user/path/to/local/repo 命令让它指向本地开发仓库。这似乎工作得很好......直到我在本地仓库中更改插件的版本,然后它在任何依赖的插件/引擎/应用程序中吐出这个错误:

Could not find user-0.0.1 in any of the sources
Run `bundle install` to install missing gems.

虽然这并不是什么大问题——版本号无论如何都会在最后更改——但事实证明,如果你在本地仓库的一个分支上,它会抛出以下错误主人:

Local override for user at /path/to/local/repo is using branch deleteme but Gemfile specifies master

从 Gemfile 中省略分支选项给我留下了这个错误:

Cannot use local override for user at /path/to/local/repo because :branch is not specified in Gemfile. Specify a branch or use `bundle config --delete` to remove the local override

所以我只是坚持让 , path: "../local-repo-directory" 散布在所有插件/引擎的 Gemfile 中,在开发过程中相互依赖,或者是有没有一种方法可以同时为 Rails 开发多个相互依赖的插件/引擎,而不使用真正草率/不优雅的解决方案?

我正在用其他方法来做这件事,所以任何帮助都将不胜感激。我希望我已经解释得足够清楚了,但如果还有什么我可以澄清的,请告诉我。

谢谢!

最佳答案

坚持在 Gemfile 中指定 git 存储库并使用 bundle local overrides对它们进行处理。

解决方案可能存在的问题: 1./path/to/local/repo 用户的本地覆盖正在使用分支 deleteme 但 Gemfile 指定 master 如果您的 Gemfile 指定分支“master”,那么本地覆盖应该检查分支“master”。这是因为本地覆盖的目标是让您可以在运行和测试应用程序时处理本地文件夹中的 gem。在生产中,它将检查 Gemfile 和 Gemfile.lock 中指定的分支和修订版,当然它应该与您使用本地覆盖运行的完全相同。

2. 在任何源中都找不到 user-0.0.1 运行 `bundle install` 来安装缺少的 gem。 当您运行 bundle install 时,它会在 Gemfile.lock 中为每个 gem 放置一个版本号。该文件被添加到 git,以便其他开发人员和您的生产服务器运行与您相同版本的 gem。您的 Gemfile.lock 需要指定与本地覆盖 gemspec 文件中返回的版本相同的 gem 版本。如果您在本地覆盖中增加了版本号,您需要在使用它的应用程序中运行“bundle update gemname”,以便它更新 Gemfile.lock。请注意,在您增加版本之前, bundle 程序会将所有内容缓存在 gemspec 文件中。因此,如果不增加 gemspec 中的版本号,则不能在 gemspec 中添加新的依赖项或更改依赖项版本。

git-bundle gem

如果您在 Gemfile 中使用带有本地覆盖的 git 存储库, bundle 程序将在您的 Gemfile.lock 中存储 git 修订散列,如上所述。示例:

gem 文件: gem '例子',git:'https://github.com/your_name/example.git',分支::master

bundle 配置 shell 命令: bundle 配置 local.example/path/to/local/git/repository

Gemfile.lock(自动生成): 地理信息系统 远程:https://github.com/your_name/example.git 修订:b9270e61abb89e1ff77fb8cfacb463e4d04388ad 部门:主

在本地覆盖存储库中提交后,您需要在主应用程序上运行 bundle install,以便它重建 Gemfile.lock 以包含新的修订散列并提交它。我建议使用下面的 gem,因为它会为您自动执行此过程,并在其他情况下也有帮助。有关详细信息,请参阅 gem 页面。

https://github.com/EPI-USE-Labs/git-bundle

activesupport-decorators gem

作为旁注,当你需要在你的 gem 之间扩展类时,你可以使用装饰器模式,它由 activesupport-decorators gem 优雅地实现:

https://github.com/EPI-USE-Labs/activesupport-decorators

关于ruby-on-rails - 开发具有依赖关系的多个 Rails 插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31173485/

相关文章:

ruby-on-rails - Rails问题: Sqlite3 dll not found on windows (even the old 1. 2.3版本)

ruby-on-rails - 在 Ruby on Rails 中将时间转换为本地时间

ruby - 使用最少的存储空间混洗大量数字

ruby - 你能在渲染过程中将 ruby​​ 对象传递给 haml 吗?

css - 未满足的同伴依赖

ruby-on-rails - 向 Rails 模型添加新字段

ruby-on-rails - 以数组作为属性的 Ruby 模型

ruby - 如何使此数组.to_json(Ruby)?它在我的程序中表现不佳,但在irb中工作正常

java - 在 Maven 依赖项中插入许可证

时间:2019-04-10 标签:c#additional dependencies-opencvsharp