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

Mark24

Everything can Mix.