shell 为MacOS应用程序打包独立的RubyGems

uwopmtnx  于 2023-06-30  发布在  Shell
关注(0)|答案(2)|浏览(146)

为了给我的用户提供最好的用户体验,并避免他们安装所有必需的软件包,我需要在MacOS应用程序中打包Ruby,RubyGems和一些gems软件包(pod,xcodeproj)。然后,我将在MacOS应用程序中通过命令行使用pod和xcodeproj。
当我试图通过指定一个自定义安装文件夹./configure ---prefix=${FOLDER}从源代码构建ruby时,在一些ruby附带的可执行文件(包括gem)中有对这个安装文件夹的静态引用。
我试图通过#!/usr/bin/env ruby更改这些可执行文件中的shebang,并将PATH设置为引用我新安装的ruby,但我遇到了这个错误,影响了我所有的配置:

`RubyGems' were not loaded.
`error_highlight' was not loaded.
`did_you_mean' was not loaded.
`syntax_suggest' was not loaded.

你有没有什么想法,如果有可能在完全独立的模式下构建ruby,如果是的话,一些关于如何做的线索?

5uzkadbs

5uzkadbs1#

这可不是件容易的事。独立的可执行文件通常被称为“静态链接”二进制文件,这意味着它的所有依赖项都被拉入并捆绑到可执行文件中。这样,它就不需要在运行时动态加载任何库,并且总是在具有兼容架构的任何系统上运行。事实上,这有一个光谱:你是否静态链接 * 所有内容 *?甚至libc?这取决于你想对结果二进制文件做什么。
幸运的是,看起来有人已经为露比做了这件事。Travelling Ruby提供了预构建的二进制文件和工具,用于制作包含gem的自定义包。

tcomlyy6

tcomlyy62#

对于有同样情况的人,我终于发现了是怎么回事。
当移动新建的ruby文件夹(包含bin/lib/include/share)时,我破坏了ruby LOAD_PATH,它负责加载包括rubygems在内的依赖项。
只需设置指向新ruby文件夹的RUBYLIB环境变量,所有问题都解决了。
例如,通过运行ruby -e 'puts $LOAD_PATH',我得到:

${OLD_RUBY_FOLDER}/lib/ruby/site_ruby/3.2.0
${OLD_RUBY_FOLDER}/lib/ruby/site_ruby/3.2.0/arm64-darwin22
${OLD_RUBY_FOLDER}/lib/ruby/site_ruby
${OLD_RUBY_FOLDER}/lib/ruby/vendor_ruby/3.2.0
${OLD_RUBY_FOLDER}/lib/ruby/vendor_ruby/3.2.0/arm64-darwin22
${OLD_RUBY_FOLDER}/lib/ruby/vendor_ruby
${OLD_RUBY_FOLDER}/lib/ruby/3.2.0
${OLD_RUBY_FOLDER}/lib/ruby/3.2.0/arm64-darwin22

为了解决这个问题,我将RUBYLIB环境变量设置为:
export RUBYLIB=${NEW_RUBY_FOLDER}/lib/ruby/site_ruby/3.2.0:${NEW_RUBY_FOLDER}/lib/ruby/site_ruby/3.2.0/arm64-darwin22:${NEW_RUBY_FOLDER}/lib/ruby/site_ruby:${NEW_RUBY_FOLDER}/lib/ruby/vendor_ruby/3.2.0:${NEW_RUBY_FOLDER}/lib/ruby/vendor_ruby/3.2.0/arm64-darwin22:${NEW_RUBY_FOLDER}/lib/ruby/vendor_ruby:${NEW_RUBY_FOLDER}/lib/ruby/3.2.0:${NEW_RUBY_FOLDER}/lib/ruby/3.2.0/arm64-darwin22
由于我的目标是直接从MacOS应用程序通过命令行调用ruby,所以我只需要在进程中配置RUBYLIB环境变量即可。

相关问题