如何在rubygems.com中手动发布一个gem

125 阅读4分钟

我一直想创建一个宝石,让它变得足够流行,广为人知,人人都在谈论它。不幸的是,直到现在,这只是一个梦想。 同时,我已经学会了如何手动创建和发布宝石,我想与你分享。也许你的宝石可以成为下一个最受欢迎的宝石,如果你的第一步是阅读这篇博文,我将为此感到超级自豪。

创建一个宝石

在写手动释放宝石一节时,我意识到你可能还没有你的宝石。 这就是我将与你分享如何创建它的原因。

在你看到的任何地方,fastruby_test ,请随意用你的宝石的名字来代替它。

gem可以通过手动创建每个文件或使用命令来生成。 让我们使用命令。

bundle gem  fastruby_test

上述命令会提示你几个问题,而答案则取决于你的偏好。 在我们的例子中,我们选择了:

  • 用于测试的RSpec
  • 用于CI的GitHub
  • MIT作为许可证
  • 是的,包括更新日志文件
  • 添加 rubocop 作为 linter。
tree
.
├── bin
│   ├── console
│   └── setup
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── fastruby_test.gemspec
├── Gemfile
├── lib
│   ├── fastruby_test
│   │   └── version.rb
│   └── fastruby_test.rb
├── LICENSE.txt
├── Rakefile
├── README.md
└── spec
    ├── fastruby_test_spec.rb
    └── spec_helper.rb

4 directories, 13 files

很好!你刚刚创建了一个新的宝石!这不是很容易吗?你刚刚创建了一个新的 gem!这不是非常容易吗?现在是准备部署 gem 的时候了。

让我们用rake 命令运行 RSpec 测试和 linter。

cd fastruby_test
rake

它返回的结果是:fastruby_test.gemspec 是无效的。你需要打开那个文件,修改有TODO: 字样的项目,像这样。

# frozen_string_literal: true

require_relative "lib/fastruby_test/version"

Gem::Specification.new do |spec|
  spec.name          = "fastruby_test"
  spec.version       = FastrubyTest::VERSION
  spec.authors       = ["Juan Vasquez"]
  spec.email         = ["juan@ombulabs.com"]

  spec.summary       = "This is an interesting gem"
  spec.description   = "This is an interesting gem's description"
  spec.homepage      = "https://github.com/fastruby/fastruby_test"
  spec.license       = "MIT"
  spec.required_ruby_version = ">= 2.6.0"

  spec.metadata["allowed_push_host"] = "https://rubygems.org"

  spec.metadata["homepage_uri"] = spec.homepage
  spec.metadata["source_code_uri"] = spec.homepage
  spec.metadata["changelog_uri"] = "#{spec.homepage}/blob/master/CHANGELOG.md"

  # Specify which files should be added to the gem when it is released.
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
  spec.files = Dir.chdir(File.expand_path(__dir__)) do
    `git ls-files -z`.split("\x0").reject do |f|
      (f == __FILE__) || f.match(%r{\A(?:(?:test|spec|features)/|\.(?:git|travis|circleci)|appveyor)})
    end
  end
  spec.bindir        = "exe"
  spec.executables   = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
  spec.require_paths = ["lib"]

  # Uncomment to register a new dependency of your gem
  # spec.add_dependency "example-gem", "~> 1.0"

  # For more information and examples about making a new gem, checkout our
  # guide at: https://bundler.io/guides/creating_gem.html
end

一旦你修复了gemspec 文件,再次运行测试,你会发现测试仍然失败。 这是由于脚手架默认创建了一个失败的测试。 让我们删除它或修复它。

# frozen_string_literal: true

RSpec.describe FastrubyTest do
  it "has a version number" do
    expect(FastrubyTest::VERSION).not_to be nil
  end

  it "does something useful" do
    expect(true).to eq(true)
  end
end
$ rspec
FastrubyTest
  has a version number
  does something useful

Finished in 0.00172 seconds (files took 0.05799 seconds to load)
2 examples, 0 failures

手动发布一个宝石

你需要有一个rubygems.org账号,如果你还没有创建,这里有一个链接可以做。

然后我们需要从命令行登录到rubygems.org,运行以下命令。

gem signin

它将提示你回答一些问题,注意你不能把所有东西都标记为y

Enter your RubyGems.org credentials.
Don't have an account yet? Create one at https://rubygems.org/sign_up
   Email:   me@example.com
Password:   your_secure_password

API Key name [computer-name-20220727155644]:
Please select scopes you want to enable for the API key (y/n)
index_rubygems [y/N]:   y
push_rubygem [y/N]:   y
yank_rubygem [y/N]:   y
add_owner [y/N]:   y
remove_owner [y/N]:   y
access_webhooks [y/N]:   y
show_dashboard [y/N]:   n

You have enabled multi-factor authentication. Please enter OTP code.
Code:   000000
Signed in with API key: computer-name-20220727155644.

只是为了确认你添加成功了,去下面的路由rubygems.org/profile/api…,新的api key的名字应该在那里。

下一步是构建gem,运行以下命令。

gem build fastruby_test

gem build fastruby_test 命令创建了一个新文件,在我的例子中,它被称为fastruby_test-0.1.0.gem (你那边的版本可能不同)。

让我们用下面的命令把它推送到rubygems.org页面。

gem push fastruby_test-0.1.0.gem

Pushing gem to https://rubygems.org...
Successfully registered gem: fastruby_test (0.1.1)

如果一切顺利,你应该能够浏览到gem urlrubygems.org/gems/fastru…

然后我们就完成了。就这样了。我们正计划在未来发布一个自动版本,如果你感兴趣,让我们保持联系。

命名一个宝石

我想跳到生成宝石的部分,但为你的宝石命名是一个超级重要的步骤。在你为你的宝石取名之前,请在rubygems.org/github.com/上进行快速搜索,看看是否有其他人取了这个名字,或者运行以下命令。

gem search next_rails
# where `next_rails` is your desired gem name

每个发布的宝石都必须有一个独特的名字。

删除一个宝石

由于一些原因,你可能想要/需要删除一个 gem 的发布版本。 考虑到我们将无法使用之前的相同 gem 版本。 在我们的案例中,这只是为了学习。

你可以执行以下命令。

gem yank fastruby_test -v 0.1.1

Yanking gem from https://rubygems.org...
Successfully deleted gem: fastruby_test (0.1.1)