我试图部署一个用ruby编写的小型命令行应用程序。应用程序依赖的许多gem都托管在我的github帐户上我已经在Gemfile中适当地指定了它们的位置。当我在部署计算机上克隆repo并从根目录运行bundle install时,一切都会顺利进行。然后,我可以使用bin/hippo运行命令行应用程序(名为“hippo”)我想将应用程序安装到系统中,这样就不需要修补$PATH或指定可执行文件的路径来使用它。
当我运行gem install /path/to/my/.gem/file时,安装失败,并说它无法解析对托管在我Github帐户上的个人gem的依赖关系我认为这是因为gem install命令不读取Gemfile,而只读取gemspec(bundler用户究竟为什么将文件命名为Gemfile,而不是BundleFile之类的?),并且gems的位置在Gemfile中指定(无法指向gemspec中的github gem,对吧?)。当我使用捆绑式支架gem附带的rake install任务时,我也有同样的问题但是,当我运行bundle exec gem install /path/to/my/gemfile然后它就可以安装了,我猜是因为它在bundler上看到我的gems改变了加载路径,并决定它们已经安装好了。但是,当我尝试运行可执行文件时,它失败了,因为它找不到所需的依赖项。(注意,可执行文件在shebang之后的第一行有require bundler/setup)。
所以我问:使用bundler部署依赖于非rubygems托管gems的命令行应用程序的好方法是什么?

最佳答案

bundle exec正确设置加载路径,以便在require bundler/setup时可以看到gems。一种选择是始终使用bundle exec bin/hippo运行二进制文件。
更适合您的目的可能是运行bundle install --standalone,它在项目目录中生成一个bundle/bundler/setup.rb文件。该文件为您正确设置了加载路径,因此您只需要从二进制文件中执行类似require_relative '../bundle/bundler/setup'的操作,而不是require 'bundler/setup'

关于ruby - 部署依赖于非Rubygems托管的Gems的Ruby命令行应用程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17218942/

10-14 16:10