将Ruby打包成可移植的可执行文件
我一直试图找到一个很好的解决方案很长一段时间:
有没有一种可靠的方法将ruby安装到可在该平台上移植的文件夹中? 我希望有一个文件夹,我可以很容易地复制到我正在制作的发行版中,这样我就可以“随时随地”拥有一个ruby环境。 如果我需要编译源代码和东西,这很好,只要我最终安装了便携式ruby。
我找到了一些试图解决这个问题的资源,但没有一个能让我满意。
便携式Ruby on Rails环境
http://hcettech.blogspot.pt/2012/05/windows-portable-rails-development.html
对我来说,这是Ruby的一个主要痛点。 如果在没有客户端首先安装Ruby的情况下无法使Ruby脚本工作,那么ruby在我的情况下基本上没有用。 我真的希望我/我们可以解决这个问题,因此有可能让Ruby比现有的更有用。
注意:我知道像Releasy这样的东西存在,但它仍然不是一个简单的ruby可执行文件。
我的目标是能够使用.bat / .sh脚本创建一个文件夹,它执行此操作:
#some bat/sh ./bin/ruby ./my_script.rb
是的,如果我对此问题有所了解,请将我击倒,因为这对我来说是一种解脱。
我对此感到厌倦,于是我决定自己解决这个问题。 几天后我终于开始工作了。
我介绍: Ruby Ship
这正是我所需要的,希望其他人也能从中受益!
它非常简单:下载repo(因为二进制文件而非常大)。 把它放在USB驱动器上,或者你想要的地方,然后做:
path/to/ruby_ship/bin/ruby_ship.sh -v => ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-darwin13.0]
这适用于linux和Mac,或者适用于Windows:
path\to\ruby_ship\bin\ruby_ship.bat -v => ruby 2.1.2p95 (2014-05-08 revision 45877) [i386-mswin32_100]
ruby_ship包装器就像普通的ruby一样,所以你可以传入一个脚本,或者做任何你会使用普通ruby命令的东西。
如果您不喜欢Ruby Ship捆绑的版本,那么只需使用tools目录中的编译脚本即可。 下载你最喜欢的Ruby版本的源代码,比如XYZ,然后执行以下操作:
# *nix (osx/linux/...) path/to/ruby_ship/tools/ruby_ship_build.sh path/to/ruby-XYZtar.gz # windows path\to\ruby_ship\tools\ruby_ship_build.bat path\to\ruby-XYZtar.gz
这将构建您的ruby风格并正确设置包装器。 现在你Ruby版XYZ是可移植的! 复制将此文件夹粘贴到您想要的位置,您就可以开始了! 但请记住,它只会针对您当前的平台进行编译,因此如果您需要其他平台,请在这些平台上进行编译。
编译过程有一些要求。 看看github网站 。
无论如何,希望其他人可能会觉得这很有用! 如果事情不适合你,请提出问题,我会调查一下!
老post,但你也可以检查我的解决方案rb2exe 。 它将ruby应用程序转换为单个,可移植,独立的可执行文件。
它支持Rails和Gemfile。
安装/使用:
gem install rb2exe echo "puts 'Hello world'" > test.rb rb2exe test.rb ./test
我在这里一步一步解释它的作用:
http://www.learnwithdaniel.com/2016/08/ruby-to-portable-exe-app/
为了澄清我对您的问题的理解,您希望能够将Ruby与脚本一起打包,所有脚本都包含在一个目录中。 就像是:
. ├── bin │ └── ruby ├── my_script.bat ├── my_script.sh └── my_script.rb
您希望这可以在多个平台上运行 – 您可以将批处理和shell脚本作为可能性,因此我假设* NIX和Windows都是潜在的目标。 这意味着要发布多个特定于平台的Ruby二进制文件。
此外,你提到不支持JRuby的gem,所以你可能使用带有原生扩展的gem。
没有工具可以满足所有这些要求:(
如果您愿意放弃使用本机扩展,并为每个目标平台构建一个包,您可以:
- 使用Ocra构建一个独立的Windows可分发版
- 使用pkgr构建Debian软件包
- 构建一个标准的OSX安装程序,它依赖于OSX中的系统Ruby(虽然有些问题 )
毋庸置疑,这将涉及相当大的开销,特别是如果您想要完全自动化这些步骤并将其作为CI的一部分进行测试(我建议在完整的CI构建结束时将其作为冒烟测试)。