仍然潜入有趣(但有点令人困惑)开发我自己的宝石/引擎的世界。
我已成功将其部署到我的(私人)GitHub帐户,但由于gem正在进行持续开发,我不想一次又一次地部署它,然后执行bundle update
等等,所以我通过指定这样的路径找到了需要gem的选项:
gem 'my_gem', path: 'path/to/my/gem'
这在开发时效果很好(它甚至似乎在rails s
运行时从gem重新加载更改的文件[至少对于助手和视图它似乎这样做,但是还没有使用控制器和模型,但是希望这也是他们的情况,这对于在主机Rails应用程序中直接使用它来开发引擎是非常好的。)
但是当部署到生产服务器时,我想从github获取gem:
gem 'my_gem', git: "git@github.com:my_company/my_gem"
可悲的是,Bundler不允许多次使用某个gem(即使它们位于不同的development/test
和production
组中),所以我正在执行以下操作:
if File.directory?('../my_gem')
gem 'my_gem', path: '../my_gem'
else
gem 'my_gem', git: "git@github.com:my_company/my_gem.git"
end
到目前为止,这似乎工作得很好(虽然没有使用Capistrano测试部署)。但它留下了一些问题:
1)这是解决问题的“正确”方法吗?似乎有点奇怪,我还没有找到一个更简单的方法,如:
gem 'my_gem', path: '../my_gem', git: "git@github.com:my_company/my_gem.git"
...我希望bundler首先尝试:path
选项,如果它不可用,则尝试使用:git
选项。但据我所知,在执行此操作时,它仅使用:git
选项。
2)开发这样的宝石是一种好习惯吗?我正在从主机应用程序中将一些功能提取到引擎中,同时,我正在增强此功能。所以我在我的主机应用程序中加载了引擎gem,并且在我的主机应用程序中,我更改了引擎代码,这些代码(感谢上帝!)反映在我的主机应用程序中,而无需重新启动rails服务器。这感觉非常“正确”,但由于在创建的引擎中有一个虚拟Rails应用程序,我有点不确定我是否应该开发我的引擎与我的主机应用程序严格隔离,或不。我认为这是一个哲学问题,但也许有人对它有意见,可以发布专业和反对意见吗?
3)如何告诉Capistrano始终自动将我自己的gem更新为GitHub的最新版本?
答案 0 :(得分:1)
你可以做到
if ENV['RAILS_ENV'] != "development"
gem 'my_gem', git: "git@github.com:my_company/my_gem.git"
else
gem 'my_gem', path: '../my_gem'
end
假设RAILS_ENV
被传递到bundle
命令(使用capistrano时就是这样)。
要将宝石更新为最新版本,请尝试制作基本上执行此操作的capistrano任务
/path/to/bundler update my_gem
我无法评论你的其他观点。我的2美分。