1. 执行命令,创建一个gem,rand_t就是你gem的名字,命名规范
执行完成之后,会生成如下文件结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| MIT License enabled in config Code of conduct enabled in config create rand_t/Gemfile create rand_t/.gitignore create rand_t/lib/rand_t.rb create rand_t/lib/rand_t/version.rb create rand_t/rand_t.gemspec create rand_t/Rakefile create rand_t/README.md create rand_t/bin/console create rand_t/bin/setup create rand_t/LICENSE.txt create rand_t/CODE_OF_CONDUCT.md Initializing git repo in /Users/tlt/gems/rand_t
|
bin路径下的两个文件是可执行文件
- bin/setup相当于执行bundle install
- bin/console 会加载rand_t,并进入irb模式,方便调试
lib路径下的文件,是我们的主目录
- 其中 rand_t.rb 是我们的入口文件,当其他程序 require ‘rand_t’ 的时候,这个文件会被加载。
入口文件 rand_t.rb 是为了加载 gem的依赖,这些依赖可以是内部的类,也可以是第三方的库。
- rand_t文件夹下,是我们要实现功能代码的地方
LICENSE.txt 许可证
README.md 是我们的gem使用文档
Rakefile 引用这个库,可以让我们使用一些内置的rake任务来发布gem
1
| require "bundler/gem_tasks"
|
.gitignore git忽略文件
rand_t.gemspec 官方文档前两行把gem的lib目录加载到 load path(ruby会寻找的额外库的path),这会允许我们从宿主调用‘rand_t’
Gem::Specification定义了一些我们gem的基本信息,名称、作者、邮箱、主页、用途等。
allowed_push_host是可以发布此gem的地址。
files是指定打包的文件
bindir和executables 指定可执行文件路径
add_development_dependency 开发环境加载的依赖
add_dependency 所有环境都加载
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| # coding: utf-8 lib = File.expand_path('../lib', __FILE__) $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) require 'rand_t/version' Gem::Specification.new do |spec| spec.name = "rand_t" spec.version = RandT::VERSION spec.authors = ["tianlitao"] spec.email = ["tianlitao3399@gmail.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'" else raise "RubyGems 2.0 or newer is required to protect against " \ "public gem pushes." end spec.files = `git ls-files -z`.split("\x0").reject do |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.13" spec.add_development_dependency "rake", "~> 10.0" end
|
Gemfile gemspec方法表明了bundler会从 rand_t.gemspec 文件去定义 gem 的依赖
2. 添加我们自己的代码
在lib/rand_t下新建 gen_num.rb,添加代码
1 2 3 4 5 6 7 8 9 10 11 12
| module RandT module GenNum def self.gen 5.times.map{ single_draw } end private def single_draw rand(0...60) end end end
|
3. 生成gem文件
1
| gem build rand_t.gemspec
|
4. 发布gem
1
| gem push rand_t-0.1.0.gem
|