开发具有依赖关系的多个Rails插件

时间:2015-07-01 23:49:02

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

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

Rake适用于主应用程序,因为它的Gemfile列出了我想要的插件/引擎的相对路径,但是当插件/引擎依赖于另一个并且没有列出相关路径时,使用{{1}我会得到一个像下面的错误(大概我会在尝试运行测试/虚拟应用程序/等时遇到同样的错误):

rake rdoc

我没有使用路径,而是尝试在插件/引擎中指定git存储库,如下所示:

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.

然后使用# 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.

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

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

所以我只是坚持让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 散布所有Gemfiles,因为插件/引擎在开发过程中彼此依赖,或者有一种方法可以同时为Rails开发多个相互依赖的插件/引擎时间不使用真正草率/不优雅的解决方案?

我正在以其他方式绘制空白,所以任何帮助都会非常感激。我希望我已经解释得这么好了,但是如果还有什么我可以澄清的,请告诉我。

谢谢!

1 个答案:

答案 0 :(得分:0)

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

解决方案可能出现的问题: 1. Local override for user at /path/to/local/repo is using branch deleteme but Gemfile specifies master 如果您的Gemfile指定分支“master”,则本地覆盖应该检出分支“master”。这是因为本地覆盖的目标是在运行和测试应用程序时可以在本地文件夹中处理gem。在生产中,它将检查Gemfile和Gemfile.lock中指定的分支和修订版本,并且它应该是您使用本地覆盖运行的正确内容。

2. Could not find user-0.0.1 in any of the sources Run `bundle install` to install missing gems. 当您运行bundle install时,它会为Gemfile.lock中的每个gem设置一个版本号。此文件已添加到git中,以便其他开发人员和您的生产服务器运行与您相同版本的gem。您的Gemfile.lock需要指定与本地覆盖gemspec文件中返回的gem相同的gem版本。如果您在本地覆盖中增加了版本号,则需要在使用它的应用程序中运行“bundle update gemname ”,以便更新Gemfile.lock。请注意,在您增加版本之前,bundler会将所有内容缓存在gemspec文件中。因此,如果不增加gemspec中的版本号,则无法在gemspec中添加新依赖项或更改依赖项版本。

git-bundle gem

如果您在Gemfile中使用git存储库并使用本地覆盖,则Bundler将在您的Gemfile.lock中存储git修订哈希,如上所述。例如:

的Gemfile: gem 'example', git: 'https://github.com/your_name/example.git', branch: :master

Bundle config shell命令: bundle config local.example /path/to/local/git/repository

Gemfile.lock(自动生成): GIT remote: https://github.com/your_name/example.git revision: b9270e61abb89e1ff77fb8cfacb463e4d04388ad branch: master

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

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

activesupport-decorators gem

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

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