在我的项目中,我有一个Gem,它的bin文件夹中包含一个shell脚本,让我们调用脚本do_something.sh。
do_something.sh实际上使用Jruby命令执行ruby脚本,该脚本名为ruby_script.rb。
我试图使用以下方法从我的项目调用do_something.sh:
bundle exec do_something.sh
它不断为脚本中的所有shell命令抛出错误。我删除了脚本的所有内容,只添加了一行" echo' Hello'"它仍然抛出以下错误
NoMethodError: undefined method
echo' for main:Object
/usr/local/rvm/gems/ruby-2.1.1@projectName/gems/gemName/bin/do_something.sh:10:in
'
/usr/local/rvm/gems/ruby-2.1.1@projectName/bin/do_something.sh:23:in load'
/usr/local/rvm/gems/ruby-2.1.1@projectName/bin/do_something.sh:23:in
'
修改#1 所有文件都有执行权限。
我还尝试将ruby_script.rb放在bin目录中,其中文件是可执行文件(根据gemspec文件中的规则)并尝试调用
echo' for main:Object
/usr/local/rvm/gems/ruby-2.1.1@projectName/gems/gemName/bin/do_something.sh:10:in
我收到错误" bundler:找不到命令:ruby_script.rb"
load'
/usr/local/rvm/gems/ruby-2.1.1@projectName/bin/do_something.sh:23:in
我收到错误" ruby:没有这样的文件或目录 - ruby_script.rb(LoadError)"
为什么我会收到此错误,如何解决?我希望能够运行do_something.sh或ruby_script.rb。目前,无法识别ruby_script.rb,do_something.sh无法识别这些命令。
答案 0 :(得分:1)
好的,最后两天后,我能够让它发挥作用。
bundle install
安装我的GEM并默认创建一个ruby包装器,以便在' bin中创建文件。目录。因此,当我使用bundle exec
调用我的脚本时,首先调用ruby包装器,然后使用ruby' load'来调用我的脚本。功能。这个加载函数需要一个ruby文件,这就是为什么文件中的所有shell脚本都会抛出错误,因为它们应该是ruby。
解决这个问题的方法是在捆绑安装之前安装我的宝石。使用以下命令:
gem install --no-wrapper my-gem
显然这个命令禁用了创建ruby包装器,我终于能够使用bundle execute do_something.sh
答案 1 :(得分:0)
在运行bundle exec时尝试指定sh。 NoMethodError
来自在ruby中执行的脚本而不是sh。
bundle exec sh do_something.sh
答案 2 :(得分:0)
为了让它发挥作用。 Setting_up_permissions_on_a_script
首先:您必须使用mode
更改文件的chomd +x file_path
第二:现在您可以bundle exec file_path
或./file_path
N.B
1:不要忘记在文件顶部添加#!/bin/sh
。
2:用deploy-a-shell-script-with-ruby-gem-and-install-in-bin-directory检查一定会对你有帮助。
希望这对你有帮助!
答案 3 :(得分:0)
根据Rubygems Specification Reference,gem中包含的可执行文件
...必须是可执行的Ruby文件。使用bash或其他解释器的文件将无效。
为了向gem添加可执行文件,请务必阅读Rubygems Guide上的Adding an executable部分。
最终,您将能够像这样运行可执行文件:
bundle exec do_something
其中bundle exec
部分是可选的。