RubyGems简介
RubyGems是一个方便而强大的Ruby程序包管理器,Ruby的第三方插件是用gem方式来管理,非常容易发布和共享,一个简单的命令就可以安装上第三方的扩展库。特点:能远程安装包,包之间依赖关系的管理,简单可靠的卸载,查询机制,能查询本地和远程服务器的包信息,能保持一个包的不同版本,基于Web的查看接口,能查看你安装的gem的信息。
安装RubyGems
- https://rubygems.org/pages/download 下载压缩包
- 解压到一个文件并且cd进去
- 通过运行ruby setup.rb安装 (你可能需要admin/root权限)
更新RubyGems镜像源
1 |
gem sources -l //查看当前使用的镜像站 |
1 |
gem sources --remove https://rubygems.org/ //删除-l出现的所有镜像源地址 |
1 |
gem sources --add https://gems.ruby-china.com/ //增加国内ruby-china源 |
确保gem sources -l只有一个源
当然所有gem配置最后都是写入到了配置文件~/.gemrc中:
1 2 3 4 5 6 7 8 |
Jakey-mini:~ Jakey$ cat ~/.gemrc --- :backtrace: false :bulk_threshold: 1000 :sources: - https://gems.ruby-china.org/ :update_sources: true :verbose: true |
SSL证书问题
rubygems.org
需要翻墙,而ruby china
源https://gems.ruby-china.org/
与http://gems.ruby-china.org/
均可,但是https
的地址存在证书验证问题。
笔者使用ruby china
源最高升级到了gem
到了2.6.7,使用http
,https
地址均没有问题,也没有证书错误。
但是使用https://rubygems.org
升级gem
到了2.6.8之后,因为rubygems
经常需要翻墙并且速度还不是那么令人满意,于是把源又切换回了ruby china
源,这就意味着以后的软件包安装升级使用的是ruby china
https
源:
提示证书问题但是在功能上没有发现有什么影响:
1 2 3 4 5 6 7 8 9 10 |
Jakey-mini:~ Jakey$ gem sources --add https://gems.ruby-china.org/ ERROR: SSL verification error at depth 1: unable to get local issuer certificate (20) ERROR: You must add /C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Certification Authority to your local trusted store ERROR: SSL verification error at depth 2: self signed certificate in certificate chain (19) ERROR: Root certificate is not trusted (/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA) https://gems.ruby-china.org/ added to sources Jakey-mini:~ runlin$ sudo gem install cocoapods Password: ERROR: SSL verification error at depth 1: unable to get local issuer certificate (20) ERROR: You must add /C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Certification Authority to your local trusted store |
升级更新RubyGems
使用gem
命令升级rubygems
,并不想使用homebrew
升级。
1 |
gem update --system //更新rubugems |
会报如下错误
1 2 3 4 |
updating rubygems-update Fetching: rubygems-update-2.6.8.gem (100%) ERROR: While executing gem ... (Gem::FilePermissionError) You don't have write permissions for the /Library/Ruby/Gems/2.0.0 directory. |
执行命令
1 |
sudo gem update --system |
会报如下错误
1 2 3 |
Updating rubygems-update ERROR: While executing gem ... (Errno::EPERM) Operation not permitted - /usr/bin/update_rubygems |
显然macOS
10.11之后,有一个新的安全功能称为Rootless,阻止你修改系统文件,如果你安装gems在/usr/local/bin
目录,不会出现问题,因为rootless
不会影响这个路径:
解决办法
1 |
sudo gem update -n /usr/local/bin --system |
如果 gem -v还是老版本,执行
1 |
sudo update_rubygems |
测试发现使用ruby-china
更新到了2.6.7,而使用https://rubygems.org
会更新到2.6.8,我猜测ruby-china
源与官方源应该存在同步问题
Rootless
简单的来说,Rootless
机制限制了 Root
账户的权限,使其没有了对系统的完全控制权:
受到权限影响的有以下几点:
- 禁止直接对 /System, /bin, /sbin, /usr 目录的修改(/usr/local 目录除外),只有通过苹果开发者认证的 app 才有权限对其修改。
- 禁止注入系统进程.,某些需要注入系统进程(finder, messages 等等系统级别的进程)的程序,debugger 无法使用了。
- 禁止加载内核扩展(kexts), 除非它们被苹果开发者正确的签名。
这些修改最明显的好处就是:恶意 app
无法通过用户授权的方式从而获得所有系统权限了
当然, 它带来的副作用也是巨大的, 一些合法的 app
也无法获得系统权限了。 比如: Homebrew
,CocoaPods
以及所有需要在 /usr/bin
目录下有可执行权限的 app
。
安装或者升级CocoaPods等软件包
同样-n
重写rubyGems
的bindir
目录,跳过rootless
的影响
1 |
sudo gem install -n /usr/local/bin GEM_NAME_HERE |
安装CocoaPods
1 |
sudo gem install -n /usr/local/bin cocoapods |
activesupport requires Ruby version >= 2.2.2
有些电脑安装CocoaPods
会提示升级:
1 |
Error installing cocoapods: activesupport requires Ruby version >= 2.2.2. |
but我的macOS
10.12
并没有遇到
1 |
ruby 2.0.0p648 (2015-12-16 revision 53162) [universal.x86_64-darwin16] |
原因是由于CocoaPods
依赖库版本配置错误(CocoaPods
官方已修正),gem
错误的安装了activesupport 5.x
,而activesupport 5.x
需要Ruby2.2.2
支持
1 2 3 4 5 6 |
Jakey-mini:~ Jakey$ gem list *** LOCAL GEMS *** activesupport (5.0.0.1,4.2.7.1) bigdecimal (default: 1.2.0) |
最简单的方法是指定兼容的activesupport
版本为4.2.6
1 2 |
sudo gem install -n /usr/local/bin activesupport -v 4.2.6 sudo gem install -n /usr/local/bin cocoapods |
如果还是不行直接安装Ruby2.2.2
即可!这里就不在讲了。
参考文献:Avoid use of activesupport
version 5
转载请注明:天狐博客 » RubyGems及CocoaPods安装与版本升级