我一直想创建一个宝石,让它变得足够流行,广为人知,人人都在谈论它。不幸的是,直到现在,这只是一个梦想。 同时,我已经学会了如何手动创建和发布宝石,我想与你分享。也许你的宝石可以成为下一个最受欢迎的宝石,如果你的第一步是阅读这篇博文,我将为此感到超级自豪。
创建一个宝石
在写手动释放宝石一节时,我意识到你可能还没有你的宝石。 这就是我将与你分享如何创建它的原因。
在你看到的任何地方,
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)