Mark24
Gem打包三两事
前置参考
开发一个gem
手动新建
gem 官方提供了一个简单的教程。 make-your-own-gem
主要围绕描述通过自己新建 gemspec、rakefile 来实现一个约定gem的打包过程。
自动脚手架
如果你已经使用了 bundler,bundler提供了一个脚手架来制作gem,生成的结果和上面的目标类似。
bundle gem <YOUR GEM NAME>
重点:打包成可执行程序 exe文件夹
以前是 bin 文件夹存放可执行文件,后来 bin 用来存放和开发相关的一些可执行文件。
现在 exe 文件夹内部用来存放对外暴露的可执行文件。
Since bundler 1.8 all application’s executables should be located inside an exe folder instead of bin, so that bin folder only contains binstubs and development-only executables. Therefore the gemspec should have
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
and file executable with chmod +x exe/gemname
最近脚手架的摘要
#file: PROJECT_NAME.gemspec
spec.bindir = "exe"
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
spec.require_paths = ["lib"]
我们需要把可执行文件,放在 exe 中。
并且最后放入什么名字,就会映射到 系统的bin中。这里为了执行方便。比如你的可执行程序是
game.rb 也请命名为 game。如果我们写成 game.rb 那么放入 PATH 的就是 game.rb 相同名字的映射文件,我们需要写 game.rb
才能执行。所以请以最终执行的结果的方式命名文件。
可执行文件的内部,完全就是ruby代码。加入这样,我们引用自己内部的文件的 class 进行主进程启动。
#!/usr/bin/env ruby
require_relative "../lib/snakes"
Snakes::Game.new.run
bundle gem 脚手架提供的 rake 帮助的程序
rake -T
脚手架提供了 build 和 install:local
可以用来调试
rake build # Build snakes-0.1.0.gem into the pkg directory
rake build:checksum # Generate SHA512 checksum if snakes-0.1.0.gem into the checksums directory
rake clean # Remove any temporary products
rake clobber # Remove any generated files
rake install # Build and install snakes-0.1.0.gem into system gems
rake install:local # Build and install snakes-0.1.0.gem into system gems without network access
rake release[remote] # Create tag v0.1.0 and build and push snakes-0.1.0.gem to rubygems.org
rake rubocop # Run RuboCop
rake rubocop:auto_correct # Auto-correct RuboCop offenses
rake test # Run tests
主要是 rake release
会帮助你根据 verison 文件的版本号,进行打包 gem 发布,以及在你的git中打上tag。
重点:关于 gem 的依赖
以前是 add_dependency
现在做了更加细致的区分
重点观察下这是一个 DSL 的描述文件,多个依赖就声明多句。
这里容易混乱的,还是要明确下 《Ruby中Gemspec和Gemfile的区别》
题外话: 安装Ruby和安装完gem但是无法工作
大概率是因为 gem 的path没有被加入到系统的path而导致的。可以在你的 .zshrc 或者 .bashrc 取决于你在用什么, 加入这两句。添加最新ruby的path。
GEM_BIN=`(gem env | sed -n "s/.*EXECUTABLE DIRECTORY: \(.*\)/\1/p")`
export PATH=$GEM_BIN:$PATH
二次补充
1.创建 Gem模板
bundle gem <项目名>
1.1 开发 Github的Actions
不同的CI机器可能平台不同
# arm64-darwin-21
# ruby
# x86_64-darwin
# x86_64-linux
bundle lock --add-platform x86_64-darwin
bundle lock --add-platform ruby
2.开发完毕 build gem
build 那个 gemspec
gem build <your_gem>.gemspec
3.本地安装检查
gem install ./<your_gem>-1.0.0.gem
4.发布
gem push ./<your_gem>-1.0.0.gem
通用Actions举例
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
# This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
# For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
name: Ruby
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
permissions:
contents: read
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
ruby-version: ['2.6', '2.7', '3.0']
steps:
- uses: actions/checkout@v3
- name: Set up Ruby
# To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
# change this to (see https://github.com/ruby/setup-ruby#versioning):
# uses: ruby/setup-ruby@v1
uses: ruby/setup-ruby@2b019609e2b0f1ea1a2bc8ca11cb82ab46ada124
with:
ruby-version: $
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
- name: Run tests
run: bundle exec rake