在不使用 git 或互联网访问的情况下部署 Ruby gem 本地

Deploy a Ruby gem local without using git or internet access

有没有办法在不访问互联网的情况下分发 Ruby gem,只需捆绑安装在开发者电脑上的 gem?

这是为了在我们的组织内部部署,互联网访问受到严格限制。所有电脑的 运行 Windows7 Ruby1.9.3 和 Bundler 1.11.2

我对 git 或捆绑器没有什么经验。 Rails 未被使用,但其他一些 gem 像 activerecord 和 logger 被使用。

我尝试了什么: 我用我的 rb 创建了一个文件夹。脚本和带有所需 gem 的 .gemspec 文件,然后我执行了 bundle gem name_of_the_gem_i_want_to_make 但出现了错误 Errno::ENOENT: No such file or directory - git config user.name。 过去我创建了一个 git 帐户并做了一些试验,但我不想使用它。

过去我尝试过使用 jRuby 和 Warble 来生成 JAR,但在这种情况下我想坚持使用 MRI Ruby。

我的开发电脑上有互联网连接,但我想部署脚本的一些电脑或服务器 - 更重要的是它们所依赖的 gem - 没有。 Ruby 虽然到处都安装好了。

我想要一种从我的开发电脑收集所有需要的文件并将它们传输到目标电脑的简单方法。 我可以压缩我的 Ruby 文件夹并将其解压缩到其他地方,但是我有很多不需要的文件。

你能给我需要使用的命令,或者给我一个解释如何执行此操作的网站吗?我在网上阅读了很多关于捆绑器的信息,但没有找到这种工作方式。 无法想象其他开发者没有同样的问题并且存在一个通用的解决方案。

编辑:

我通过执行 gem build mygem.gemspec 设法创建了一个 gem,但它只有我自己的脚本,不需要 gem。

编辑:按照 Mihai 的建议,删除了之前的尝试。

创建一个子文件夹 vendor/gems 并将 2 个 gem 文件复制到那里。

现在我可以使用以下 Gemfile 执行 bundle packagebundle install --no-deployment

gem 'active_record', '4.1.1', :path => 'vendor/gems'
gem 'logger', '1.2.8', :path => 'vendor/gems'

现在的问题:如何将其部署到另一台电脑上?复制文件夹中的所有内容并在目标电脑上执行 bundle install --local ?或者有没有办法将所有内容捆绑在 gem 中,以便在目标电脑上我可以做 gem install mygem --local ? gem build mygem 不包含捆绑包中的任何内容。

您可以通过两种方式执行此操作。

a) 缓存 (package) 项目的 vendor/cache 文件夹中的 gem

bundle package

这将 generate/update Gemfile.lock 并将所有 gem 本地复制到项目的 vendor/cache 文件夹中。然后您可以将您的项目文件复制到您的服务器和 运行

bundle install --local # translates to pick my gems from vendor/cache

b) 使用自定义路径,通常位于项目之外

bundle install支持本地路径

gem install --local path_to_my_gem/my_gem.gem

--local 标志是可选的,但在这种情况下很有用,因为它会跳过通常的远程存储库中的查找。

后续也可以在Gemfile中指定路径

gem "my_gem", path: "path_to_my_gem/my_gem.gem"

Mihai 的解决方案结合本地 gem 文件夹和 --no-deployment 选项在某种程度上有效,但存在一些问题: - 在目标电脑上,您需要先使用本地复制的 gem 执行 gem install bundler,然后对您之前制作和复制的包执行 bundle install --local - 对于 gems ruby-oci8 和 activerecord-oracle_enhanced-adapter 我对其他 gems 的解决方案由于某种原因(与 mingw32 平台有关)

由于有关包的创建和安装的工作以及问题仍然存在,我决定 - 暂时 - 求助于良好的旧批处理方法并制作了以下批处理脚本。

这只是 windows - 显然 - 但我认为这很容易成为其他 OS 的适配器。

gems 是从本地副本安装的,不需要互联网连接,activerecord 的依赖项也一样,不需要指定它们,但 gems 需要存在。

devkit 是 i18n 和 json gems 所必需的,它们都是 activerecord 的依赖项。

这里是我需要的gem文件列表,这取决于您在开发电脑上使用的版本。

activemodel-4.1.1.gem
activerecord-4.1.1.gem
activerecord-oracle_enhanced-adapter-1.5.6.gem
activesupport-4.1.1.gem
arel-5.0.1.20140414130214.gem
builder-3.1.4.gem
bundler-1.11.2.gem
i18n-0.7.0.gem
json-1.8.2.gem
logger-1.2.8.gem
minitest-5.3.4.gem
ruby-oci8-2.1.2-x86-mingw32.gem
thread_safe-0.3.4.gem
tzinfo-1.2.2.gem

您可以在 C:\Rubyxxx\lib\ruby\gems.9.1\cache

下找到它们

这里是批次

@ECHO OFF
rem in case started as administrator in folder \windows\system32
pushd "%~dp0"

rem check if ruby is installed, if not, start installation
if not exist c:\ruby193 (
  echo Install Ruby 1.9.3 to c:\ruby193
  start /w \myshare\ruby\rubyinstaller-1.9.3-p551.exe
)

rem check if devkit is installed, if not, copy folder local
if not exist c:\devkit (
  echo Copying devkit..
  md c:\devkit
  xcopy /s \myshare\devkit c:\devkit
)

echo Adding the DevKit to PATH
set path=c:\devkit\bin;c:\devkit\mingw\bin;%PATH%
rem gems is a folder containing all the gemfiles needed
cd gems
call gem install logger-1.2.8.gem --no-rdoc --no-ri --local
call gem install activerecord-4.1.1.gem --no-rdoc --no-ri --local
call gem install ruby-oci8-2.1.2-x86-mingw32.gem --no-rdoc --no-ri --local
call gem install activerecord-oracle_enhanced-adapter-1.5.6.gem --no-rdoc --no-ri --local
cd ..

不过,我希望有人发布针对捆绑器方法(或更好)的解决方案。