制作第一个gem包

通常,如果我们想分发应用程序和库,则我们需要将其打包。

软件包包含已经编译的和直接运行的软件。通常这些包还会包含其他的一些关于包的一些文档信息。

我们用包管理工具去实现共享和分发,所以,通常我们也会用这个包管理工具去进行打包。例如,用RPM去打包rpm,用RubyGems去打包ruby的包。无论用那个包管理工具去进行打包,都要求我们必须满足其打包条件。

包管理工具

RubyGems是针对Ruby默认的包管理工具,无论是打包,下载,查找还是分发,我们都离不开它。

说到打包,则RubyGems提供给开发者非常标准化的结构去打包我们的应用为Gems。

一个Gem包就是一个Ruby应用程序,其包含库和代码的一系列依赖等。

包结构

一个Gem包包含不同的组件。每一个组件都有其特定的位置。

组件清单为:

  • 程序代码
  • 测试代码
  • 依赖表述
  • 二进制文件
  • 相关文档
  • 包信息

则实际结构如下:

lib: 为代码所放位置。Rakefile:用rake去build库。.gemspec文件,包含这个包的所有关键信息,例如名字,版本,目录等。

准备必备工具

安装Ruby和bundler 可参考以下文件:

准备包结构

我们有很多种方法去开始打包一个Gem包。其中一个非常流行的方法就是使用Bundler(基于ruby的用来管理ruby项目的环境和依赖管理的工具)。这个工具可以用来快速建立Gem分发目录来开启我们的打包的过程。

bundle gem say_hello

这个指令会在say_hello目录下生成所有必须的目录,如下

[wlin@wlin my_first_gem]$ ls -al
total 56
drwxrwxr-x.   6 wlin wlin 4096 Sep 11 18:00 .
drwx------. 121 wlin wlin 4096 Sep 11 18:00 ..
drwxrwxr-x.   2 wlin wlin 4096 Sep 11 18:00 bin
-rw-rw-r--.   1 wlin wlin 3223 Sep 11 18:00 CODE_OF_CONDUCT.md
-rw-rw-r--.   1 wlin wlin  167 Sep 11 18:00 Gemfile
drwxrwxr-x.   7 wlin wlin 4096 Sep 11 18:00 .git
-rw-rw-r--.   1 wlin wlin   73 Sep 11 18:00 .gitignore
drwxrwxr-x.   3 wlin wlin 4096 Sep 11 18:00 lib
-rw-rw-r--.   1 wlin wlin 1076 Sep 11 18:00 LICENSE.txt
-rw-rw-r--.   1 wlin wlin 1857 Sep 11 18:00 say_hello.gemspec
-rw-rw-r--.   1 wlin wlin  198 Sep 11 18:00 Rakefile
-rw-rw-r--.   1 wlin wlin 1794 Sep 11 18:00 README.md
drwxrwxr-x.   2 wlin wlin 4096 Sep 11 18:00 test
-rw-rw-r--.   1 wlin wlin  107 Sep 11 18:00 .travis.yml

版本管理相关的也在这个过程被创建。

创建一个.gemspec文件

.gemspec文件包含了许多关于这个gem包的许多关键信息。

默认生成的.gemspec如下:


lib = File.expand_path("../lib", __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require "say_hello/version"

Gem::Specification.new do |spec|
  spec.name          = "say_hello"
  spec.version       = SayHello::VERSION
  spec.authors       = ["Cara Wang"]
  spec.email         = ["wlin@redhat.com"]

  spec.summary       = %q{TODO: Write a short summary, because RubyGems requires one.}
  spec.description   = %q{TODO: Write a longer description or delete this line.}
  spec.homepage      = "TODO: Put your gem's website or public repo URL here."
  spec.license       = "MIT"

  # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
  # to allow pushing to a single host or delete this section to allow pushing to any host.
  if spec.respond_to?(:metadata)
    spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'"

    spec.metadata["homepage_uri"] = spec.homepage
    spec.metadata["source_code_uri"] = "TODO: Put your gem's public repo URL here."
    spec.metadata["changelog_uri"] = "TODO: Put your gem's CHANGELOG.md URL here."
  else
    raise "RubyGems 2.0 or newer is required to protect against " \
      "public gem pushes."
  end

  # 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('..', __FILE__)) do
    `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
  end
  spec.bindir        = "exe"
  spec.executables   = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
  spec.require_paths = ["lib"]

  spec.add_development_dependency "bundler", "~> 1.16"
  spec.add_development_dependency "rake", "~> 10.0"
  spec.add_development_dependency "minitest", "~> 5.0"
end

我们可以看到,这个spec文件是一个ruby文件,这个文件是可供编辑的,除了以上内容,通常,我们还会需要指定最小ruby版本,如下:

spec.required_ruby_version = ">= 2.0"

放置应用程序代码

框架和应用代码都需要放到/lib目录下。这个目录里,必须有一个和你的gem命名一致的ruby脚本。这个文件是你的gem包可被别的gem包或者应用程序引用的关键。如默认生成的目录格式:

[wlin@wlin lib]$ cd ..
[wlin@wlin say_hello]$ ls -al lib
total 16
drwxrwxr-x. 3 wlin wlin 4096 Sep 16 09:17 .
drwxrwxr-x. 6 wlin wlin 4096 Sep 11 18:00 ..
drwxrwxr-x. 2 wlin wlin 4096 Sep 16 09:17 say_hello
-rw-rw-r--. 1 wlin wlin   81 Sep 11 18:00 say_hello.rb
[wlin@wlin my_first_gem]$ ll lib/say_hello
total 4
-rw-rw-r--. 1 wlin wlin 42 Sep 11 18:00 version.rb

让我们在其基础上,加入更多的代码,实现打招呼的功能。

[wlin@wlin say_hello]$ pwd
/home/wlin/say_hello/lib/say_hello
[wlin@wlin say_hello]$ cat lib/say_hello/hello.rb 
class Hello
  def self.say_to(n = "Cara")
    'Hello, ' + n
  end
end
[wlin@wlin say_hello]$ cat lib/say_hello.rb 
require "say_hello/version"
require 'say_hello/hello'

module SayHello
  def self.say_to(n = 'Cara')
    say_hello = Hello
    say_hello.say_to(n)
  end
end

验证代码没有问题,如下:

使用bundle console加在该模块,默认该命令会根据spec文件进行加载。则验证过程如下:

[wlin@wlin say_hello]$ bundle console
2.3.8 :001 > SayHello.say_to('Cara Wang')
 => "Hello, Cara Wang" 

默认生成的spec文件是无法直接使用的,因为有些‘Todo’的部分必须更新,否则上述命令编译会直接输出语法错误。

其实,这时你的gem包就已经制作完成了。

列出包的依赖

在真实的环境中,通常我们的包会依赖于别的包,这些包也需要在.gemspec中列出。如下:

# Usage: spec.add_runtime_dependency "[gem name]", [[version]]
spec.add_runtime_dependency "activesupport", [">= 4.0"]

提交你的gem包

如下,提交你的gem到你的公共repo上。

如,我将我的gem包传到我的repo上: https://github.com/testcara/say_hello

发布gem包

上述一切准备就绪后,让我们发布我们的包到RubyGems.org上。

首先,你需要在https://rubygems.org/sign_up上注册一个帐号。

创建包并发布包

使用gem工具来进行编包,如下:

[wlin@wlin say_hello]$ gem build say_hello.gemspec 
  Successfully built RubyGem
  Name: say_hello
  Version: 0.1
  File: say_hello-0.1.gem

发布gem,如下

[wlin@wlin say_hello]$ gem push say_hello-0.1.gem 
Enter your RubyGems.org credentials.
Don't have an account yet? Create one at https://rubygems.org/sign_up
   Email:   wlin@redhat.com
Password:   

Signed in.
Pushing gem to https://rubygems.org...
Successfully registered gem: say_hello (0.1)

则可以在rubygems官网上,找到自己的gem了,

https://rubygems.org/gems/say_hello

则我们安装gem包来尝试以下

[wlin@wlin ~]$ gem install say_hello
Successfully installed say_hello-0.1
Parsing documentation for say_hello-0.1
Done installing documentation for say_hello after 0 seconds
1 gem installed
[wlin@wlin ~]$ irb
2.2.4 :001 > require 'say_hello'
 => true 
2.2.4 :002 > SayHello.say_to()
 => "Hello, Cara" 
2.2.4 :003 > SayHello.say_to('Cara Wang')
 => "Hello, Cara Wang" 
2.2.4 :004 > 

 

  • 1
    点赞
  • 1
    收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页
评论 1

打赏作者

solinger

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值