Ruby:'捆绑exec'抛出所有shell命令的错误

时间:2016-08-22 07:05:39

标签: ruby shell rubygems

在我的项目中,我有一个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无法识别这些命令。

4 个答案:

答案 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部分是可选的。