【问题标题】:shebang for multiple versions多个版本的shebang
【发布时间】:2013-11-25 21:47:33
【问题描述】:

在我的大量 Ruby 脚本中,我确实以常见的 shebang 开始我的脚本:

#!/usr/bin/env ruby

现在我发现了一些确实需要特定 Ruby 版本的脚本,不,它们不是可以在特定 Ruby 版本下部署的 Rails 应用程序。它们只是可以从命令行启动的单文件脚本,无法与系统版本一起使用。

在运行文件的以下代码之前,有什么办法可以编写一个用rbenv/rvm设置环境的shebang?

【问题讨论】:

  • 你怎么知道每个脚本需要什么 ruby​​?似乎您有查找问题或文件组织问题需要在这里解决。

标签: ruby rvm rbenv shebang


【解决方案1】:

您不一定需要设置任何环境。您所需要的只是您要运行的 ruby​​ 二进制文件的路径,其他一切都会随之而来。

这是一个关于如何设置它的示例:

  1. 创建一个文件夹~/bin。这将保存指向您所有个人 ruby​​ 二进制文件的指针(符号链接)。

  2. 更新您的 shell PATH,使 ~/bin 包含在可执行文件的搜索路径中。

  3. ~/bin 中所需的任何 ruby​​ 二进制文件符号链接到实际的 ruby​​ 二进制文件。

例如在我的~/bin 我有:

ruby18 -> /opt/ruby18/bin/ruby
ruby19 -> /opt/ruby19/bin/ruby
ruby20 -> /opt/ruby20/bin/ruby

现在假设您有一个需要 1.9 才能运行的脚本。那么你需要做的就是:

#!/usr/bin/env ruby19

如果您已将 gem 安装到每个 ruby​​ 可执行文件的默认 gem 目录中,这将起作用。如果您在其他地方安装了 gem,那么它会变得更加复杂,您需要在运行脚本之前修改 GEM_PATH

如果您不想花哨 ~/bin,那么只需硬编码您的 shebang 行,而不是直接指向 ruby​​ 二进制文件:

#!/opt/ruby19/bin/ruby

...或等效的 rbenv/rvm 路径。

如果假设您编译了一个 ruby​​ 1.9 的新补丁,并且您想将它放在另一个文件夹中,例如 /opt/ruby19-p123,那么在您的 ~/bin 中包含符号链接将允许您更轻松地更新您的 bin 指针。然后你只需要更新~/bin 中的符号链接,你的所有脚本都会运行新的补丁版本。

【讨论】:

    【解决方案2】:

    rbenv 将查找由(例如)设置的.ruby-version 文件

    $ rbenv local 1.9.3-p448
    

    创建一个简单的文件,check

    #!/usr/bin/env ruby
    puts RUBY_VERSION
    

    使其可执行

    $ chmod +x check
    

    运行它

    $ ./check
    

    输出

    1.9.3
    

    也就是说,这不是每个文件的设置。如果有办法使用 shebang 改变 rbenv 的行为,那可能会更合适。

    【讨论】:

    • 是的,但同意您到目前为止的答案是解决方案的1/2。另一半是编写一个使用它的启动器,或者更好的 ruby​​ 路径,然后使用适当的 ruby​​ 启动目标脚本
    • CD 进入目录可能允许对 ruby 的本机调用以获取 .rbenv-version 文件。
    • .ruby-version(不是 .rbenv-version)与您的工作目录无关,它基于脚本所在的目录。如果您将每个脚本与 .ruby-version 配对,那么你会没事的。否则,您可能必须按照 Casper 的建议链接到特定版本的 ruby​​。你不能做很多其他事情并且是便携的,因为不能保证 shebang 可以选择多个选项 (stackoverflow.com/questions/4303128/…)
    猜你喜欢
    • 2013-09-30
    • 2012-08-17
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    相关资源
    最近更新 更多