如何部署Rails应用程序并在用户目录中安装Ruby Native Extension

时间:2013-01-07 01:07:09

标签: ruby deployment capistrano bundler

有没有人知道如何部署到服务器并在用户目录中安装本机扩展?

我正在使用capistrano和bundler,并且没有对/ usr / local的写访问权限...具有Native扩展名的Gems(在当前情况下为bcrypt-ruby)不会安装。我最初的问题是无法找到“config.h。”

在对生成的Makefile进行一些调查时,这一行是罪魁祸首:

 $(OBJS): $(hdrdir)/ruby.h $(hdrdir)/ruby/defines.h $(arch_hdrdir)/ruby/config.h

Mkmf以这种方式定义arch_hdrdir:

arch_hdrdir = $(extout)/include/$(arch)

为什么这样做有点莫名其妙。不幸的是,$ extout是“”,因此,Make正在/include/i686-linux/ruby/config.h中查找配置并失败。

对mkmf的进一步调查让我认为$ extout被设置为在install_dirs中评估为true的东西,但最终成为makefile中的空字符串。但是,我无法弄清楚它的设定位置。

为了解决问题,我尝试在extconf.rb中设置$ extout。但...

1)如果我将它设置为'/ usr / local / lib / ruby​​',makefile会尝试将.so安装到/ usr / local / lib / ruby​​ ...我没有写访问权限。嘘声。

2)我尝试将$ extout设置为'/ home / crivens / railsapp / shared / bundle'。这实际上编译,但然后应用程序找不到.so文件。我不得不做一堆黑客到达那里。

花了很多时间在这之后,我正在寻找建议!

  1. 是否可以安装具有本机扩展名的gem而无需访问系统存储库?
  2. 这样做的最佳策略是什么?
  3. mkmf记录在哪里吗? (我肯定找不到太多的注意事项)
  4. 什么是$ extout以及如何设置?
  5. 提前致谢。

2 个答案:

答案 0 :(得分:1)

我认为您正在寻找的是ruby版本管理器(rvm)。它可以在这里使用,并允许您管理Ruby,Rails和Gem集的版本。

https://rvm.io/

这里有一个很好的入门指南:http://rvm.beginrescueend.com/rvm/install/

以下是安装的方式:

[sam@mungr ~]$ \curl -L https://get.rvm.io | bash -s stable --ruby
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 10956  100 10956    0     0   2240      0  0:00:04  0:00:04 --:--:--  2240
Please read and follow further instructions.
Press ENTER to continue.
Downloading RVM from wayneeseguin branch stable
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 1243k  100 1243k    0     0   570k      0  0:00:02  0:00:02 --:--:--  929k

Installing RVM to /home/sam/.rvm/
    Adding rvm PATH line to /home/sam/.bashrc /home/sam/.zshrc.
    Adding rvm loading line to /home/sam/.bash_profile /home/sam/.zprofile.

# RVM:  Shell scripts enabling management of multiple ruby environments.
# RTFM: https://rvm.io/
# HELP: http://webchat.freenode.net/?channels=rvm (#rvm on irc.freenode.net)
# Cheatsheet: http://cheat.errtheblog.com/s/rvm/
# Screencast: http://screencasts.org/episodes/how-to-use-rvm

# In case of any issues read output of 'rvm requirements' and/or 'rvm notes'

Installation of RVM in /home/sam/.rvm/ is almost complete:

  * To start using RVM you need to run `source /home/sam/.rvm/scripts/rvm`
    in all your open shell windows, in rare cases you need to reopen all shell windows.

# sam,
#
#   Thank you for using RVM!
#   I sincerely hope that RVM helps to make your life easier and
#   more enjoyable!!!
#
# ~Wayne


rvm 1.17.7 (stable) by Wayne E. Seguin <wayneeseguin@gmail.com>, Michal Papis <mpapis@gmail.com> [https://rvm.io/]

No binary rubies available for: downloads/ruby-1.9.3-p362.
Continuing with compilation. Please read 'rvm mount' to get more information on binary rubies.
Fetching yaml-0.1.4.tar.gz to /home/sam/.rvm/archives
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  460k  100  460k    0     0   342k      0  0:00:01  0:00:01 --:--:--  492k
Extracting yaml to /home/sam/.rvm/src/yaml-0.1.4
Configuring yaml in /home/sam/.rvm/src/yaml-0.1.4.
Compiling yaml in /home/sam/.rvm/src/yaml-0.1.4.
Installing yaml to /home/sam/.rvm/usr
Installing Ruby from source to: /home/sam/.rvm/rubies/ruby-1.9.3-p362, this may take a while depending on your cpu(s)...
ruby-1.9.3-p362 - #downloading ruby-1.9.3-p362, this may take a while depending on your connection...
ruby-1.9.3-p362 - #extracting ruby-1.9.3-p362 to /home/sam/.rvm/src/ruby-1.9.3-p362
ruby-1.9.3-p362 - #extracted to /home/sam/.rvm/src/ruby-1.9.3-p362
ruby-1.9.3-p362 - #configuring
ruby-1.9.3-p362 - #compiling
ruby-1.9.3-p362 - #installing 
Retrieving rubygems-1.8.24
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  371k  100  371k    0     0   430k      0 --:--:-- --:--:-- --:--:--  611k
Extracting rubygems-1.8.24 ...
Removing old Rubygems files...
Installing rubygems-1.8.24 for ruby-1.9.3-p362 ...
Installation of rubygems completed successfully.
Saving wrappers to '/home/sam/.rvm/bin'.
ruby-1.9.3-p362 - #adjusting #shebangs for (gem irb erb ri rdoc testrb rake).
ruby-1.9.3-p362 - #importing default gemsets (/home/sam/.rvm/gemsets/), this may take time ...
Install of ruby-1.9.3-p362 - #complete 
Creating alias default for ruby-1.9.3-p362.
Recording alias default for ruby-1.9.3-p362.
Creating default links/files
Saving wrappers to '/home/sam/.rvm/bin'.

  * To start using RVM you need to run `source /home/sam/.rvm/scripts/rvm`
    in all your open shell windows, in rare cases you need to reopen all shell windows.

一旦完成,我就可以完全安装Ruby 1.9.3-p362:

[sam@mungr ~]$ source /home/sam/.rvm/scripts/rvm
[sam@mungr ~]$ rvm list

rvm rubies

=* ruby-1.9.3-p362 [ x86_64 ]

# => - current
# =* - current && default
#  * - default

哪个版本的Ruby?

[sam@mungr ~]$ which ruby
~/.rvm/rubies/ruby-1.9.3-p362/bin/ruby

一个小小的Hello World

[sam@mungr ~]$ ruby -e "puts 'Hello world'"
Hello world

编辑#1

通过讨论这个问题的过程,作者Crivens注意到他收到了以下错误:

  

错误卷曲:(77)SSL CA证书问题(路径?访问权限?)   OS是Linux版本2.6.32-042stab055.16(root @ rh6-build-x64)(gcc   版本4.4.4 20100726(Red Hat 4.4.4-13)(GCC))#1 SMP Fri Jun 8   19:22:28 MSD 2012.我仍然希望使用ruby的系统安装。

如果您遇到此错误,通常意味着以下两种情况之一:

1。我认为你刚刚错过了这个RPM,ca-certificates-2010.63-3.el6。这些是证书。 My install of RVM on a Ubuntu 8.04.4 machine fails. Should I install it as multi-user instead?

解决方案#1

% yum install ca-certificates-2010.63-3.el6

2。 rvm的开发人员,Wayne,将URL从rvm.beginrescueend.com更改为rvm.io,并且可能已经推出了SSL证书。 Curl Certificate Error when Using RVM to install Ruby 1.9.2

解决方案#2

% curl -L get.rvm.io | bash -s stable

-or-

% echo insecure > ~/.curlrc

答案 1 :(得分:0)

如果您不想出于任何原因在服务器中安装RVM或rbenv,您仍然可以使用具有权限(root?)权限的用户从服务器安装gem,使用:

gem install bcrypt-ruby --install-dir /path/to/deploy/shared/bundle/ruby/1.9.1/`

之后,捆绑将只接受那个宝石。当然,如果您更新Gemfile中的gem,则应重复此操作。