Ruby学习: 开发自己的Ruby库

一、开发 Ruby

  • 安装bundle
gem install bundle 
复制代码
  • cd到桌面
cd /Users/mac/Desktop
复制代码

1、创建 想要开发的 Ruby 库的框架

  • 格式
bundle gem 名称
复制代码
  • 示例
bundle gem bwgem
复制代码
  • 桌面生成 bwgem 文件夹, 里面自动生成了一些文件

  • cdbwgem文件夹
cd bwgem
复制代码
  • 可以使用tree工具查看目录结构
MACdeiMac:bwgem mac$ tree
.
├── CODE_OF_CONDUCT.md
├── Gemfile
├── LICENSE.txt
├── README.md
├── Rakefile
├── bin
│   ├── console
│   └── setup
├── bwgem.gemspec
└── lib
    ├── bwgem
    │   └── version.rb
    └── bwgem.rb

3 directories, 10 files
复制代码

tree工具可以使用homebrew安装, 执行brew install tree

  • 使用Rubymine打开bwgem文件夹

2、查看Gemfile文件

  • Gemfile文件内容如下
# frozen_string_literal: true

source "https://rubygems.org"

# Specify your gem's dependencies in bwgem.gemspec
gemspec

gem "rake", "~> 13.0"

gem "rubocop", "~> 1.7"
复制代码
  • 可以看到, 在Gemfile中会加载gemspec, 就是生成的 bwgem.gemspec 文件
  • 也就是说, 通过bundle install安装的内容, 就在bwgem.gemspec文件中配置

3、实现自定义功能

  • 查看lib文件夹中的bwgem.rb文件, 可以看到自动生成了模块Bwgem
# frozen_string_literal: true

require_relative "bwgem/version"

module Bwgem
  class Error < StandardError; end
  # Your code goes here...
end
复制代码
  • lib文件夹中创建文件write_file.rb文件, 并编写如下代码
module Bwgem
  class Writer
    def initialize(write_file_path, content)
      # 将 content, 写到 write_file_path 文件中
      File.open(write_file_path, "w+") { |f| f.write(content) }
    end
  end
end
复制代码
  • 然后在bwgem.rb文件中导入write_file.rb文件
# frozen_string_literal: true

require_relative "bwgem/version"

module Bwgem
  class Error < StandardError; end
  # Your code goes here...
  require 'write_file'
end
复制代码

4、在 bin 文件夹中 创建属于自己的工具

  • bin 文件夹中自动生成的两个文件consolesetup删除
rm -rf console
rm -rf setup
复制代码
  • bin 文件夹中创建属于自己的工具文件, 我这里取名为bwtest

5、编写 gemspec 文件

  • 查看bwgem.gemspec文件内容
# frozen_string_literal: true

require_relative "lib/bwgem/version"

Gem::Specification.new do |spec|
  spec.name          = "bwgem"
  spec.version       = Bwgem::VERSION
  spec.authors       = ["TODO: Write your name"]
  spec.email         = ["TODO: Write your email address"]

  spec.summary       = "TODO: Write a short summary, because RubyGems requires one."
  spec.description   = "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"
  spec.required_ruby_version = Gem::Requirement.new(">= 2.4.0")

  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."

  # 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 { |f| f.match(%r{\A(?:test|spec|features)/}) }
  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
复制代码
# frozen_string_literal: true

require_relative "lib/bwgem/version"

Gem::Specification.new do |spec|
  spec.name          = "bwgem"
  spec.version       = Bwgem::VERSION
  spec.authors       = ["伯文"]                                                  # 作者昵称
  spec.email         = ["邮箱"]                                                  # 作者邮箱

  spec.summary       = "描述"
  spec.description   = "详细描述"                                                 # 详细描述
  spec.homepage      = "https://www.baidu.com"                                  # 主页
  spec.license       = "MIT"
  spec.required_ruby_version = Gem::Requirement.new(">= 2.4.0")     # 支持的最低版本

  spec.files = Dir["lib/**/*.rb"] + %w{ bin/bwtest  README.md LICENSE.txt }     # 自定义Ruby库中的文件

  spec.executables   = %w{ bwtest }                                               # 可执行文件
  spec.require_paths = %w{ lib }                                                # 使用绝对路径加载文件: require '文件路径'
end
复制代码

6、在自定义工具中编写自定义功能

  • 找到bin文件家中的bwtest文件, 编写自定义功能
#!/usr/bin/env ruby

# 因为 bwgem.gemspec 文件中的 spec.require_paths = %w{ lib }, 所以可以使用 `require` 直接加载 `lib` 文件夹中的文件
require 'bwgem'

puts "这是一个简单的 Ruby 库"

# ARGV: 执行本文件时, 传入的参数数组
# ARGV[0]: 文件路径
# ARGV[1]: 写入文件中的内容
Bwgem::Writer.new(ARGV[0], ARGV[1])
复制代码

bwtest中的功能是: 在调用时, 传入两个参数, 第一个参数是文件路径, 第二个参数是需要写入文件中的内容

7、执行自定义工具

  • 终端执行
# cd /Users/mac/Desktop/bwgem
bundle install
复制代码
  • 执行 bwgem 文件
# 在桌面的txt文件中, 写入 hello world!
bundle exec bwtest /Users/mac/Desktop/txt 'hello world!'
复制代码
  • 终端打印
这是一个简单的 Ruby 库
复制代码
  • 同时桌面生成txt文件, 内容是hello world!

二、将开发的 Ruby 库上传至 RubyGems

1、将开发的工具推送到远程git仓库

  • 码云 上创建一个git仓库

  • 在执行bundle gem bwgem时, 就自动生成了本地的git仓库

  • 修改 bwgem.gemspec 文件
# frozen_string_literal: true

require_relative "lib/bwgem/version"

Gem::Specification.new do |spec|
  spec.name          = "bwgem"
  spec.version       = Bwgem::VERSION
  spec.authors       = ["bwwen"]                                                 # 作者昵称
  spec.email         = ["[email protected]"]                                      # 作者邮箱

  spec.summary       = "描述"
  spec.description   = "详细描述"                                                 # 详细描述
  spec.homepage      = "https://gitee.com/lingtian.com/bwgem.git"               # 主页: git仓库地址
  spec.license       = "MIT"
  spec.required_ruby_version = Gem::Requirement.new(">= 2.4.0")     # 支持的最低版本

  spec.files = Dir["lib/**/*.rb"] + %w{ bin/bwtest  README.md LICENSE.txt }     # 自定义Ruby库中的文件

  spec.executables   = %w{ bwtest }                                               # 可执行文件
  spec.require_paths = %w{ lib }                                                # 使用绝对路径加载文件: require '文件路径'
end
复制代码
  • 修改发布的版本号

  • 关联创建的远程git仓库, 并将本地代码推到远程仓库
git remote add origin https://gitee.com/lingtian.com/bwgem.git
git add .
git commit -m '初始化'
git push --set-upstream origin master
复制代码
  • 打上tag
git tag 1.0.0
git push --tags
复制代码

2、注册RubyGems账号

3、本地安装开发的Ruby工具

  • 终端执行
# cd /Users/mac/Desktop/bwgem
gem build bwgem.gemspec
复制代码
  • 成功打印
Successfully built RubyGem
Name: bwgem
Version: 1.0.0
File: bwgem-1.0.0.gem
复制代码
  • 会生成 bwgem-1.0.0.gem 文件

  • 本地gem安装
gem install ./bwgem-1.0.0.gem
复制代码
  • 可以查看本地安装的Ruby工具: bwgem-1.0.0

  • 调用命令卸载
gem uninstall bwgem
复制代码

4、将工具上传至RubyGems

  • 执行命令, 过程需要输入在RubyGems注册时的密码
# curl -u RubyGems注册账号 https://rubygems.org/api/v1/api_key.yaml > ~/.gem/credentials
curl -u bwgem https://rubygems.org/api/v1/api_key.yaml > ~/.gem/credentials
复制代码
chmod 0600 ~/.gem/credentials
复制代码
  • 执行命令, 将生成的bwgem-1.0.0.gem文件推送到RubyGems
gem push bwgem-1.0.0.gem
复制代码
  • bwgem-1.0.0.gem被推送到RubyGems之后, 打开 RubyGems, 登录账号可以看到下图

  • 此时, 就可以让别人使用自己开发的Ruby库了
  • 使用gem安装
gem install bwgem
复制代码

5、执行开发的Ruby工具

  • 使用gem安装工具
gem install bwgem
复制代码
  • 执行开发的Ruby工具
bwtest /Users/mac/Desktop/say.txt 'Hello World!'
复制代码
  • 可以看到终端打印
这是一个简单的 Ruby 库
复制代码
  • 同时桌面生成say.txt文件, 内容是Hello World!

三、升级自己开发的Ruby库

  • 根据自己的需要, 修改代码
  • 我这里修改了bin文件夹中bwtest文件的实现
#!/usr/bin/env ruby

# 因为 bwgem.gemspec 文件中的 spec.require_paths = %w{ lib }, 所以可以使用 `require` 直接加载 `lib` 文件夹中的文件
require 'bwgem'
require 'pathname'


puts "#{ARGV[0]} 中写入 #{ARGV[1]}"

# ARGV: 执行本文件时, 传入的参数数组
# ARGV[0]: 文件路径
# ARGV[1]: 写入文件中的内容
Bwgem::Writer.new(ARGV[0], ARGV[1])
复制代码
  • 接着修改版本号

  • 将代码推送到远程Git仓库, 并打上tag
git add .
git commit -m '3.0.0'
git push origin master
git tag 3.0.0
git push --tags
复制代码
  • 接着通过bwgem.gemset生成bwgem-3.0.0.gem
gem build bwgem.gemspec 
复制代码
  • 成功后终端打印
Successfully built RubyGem
Name: bwgem
Version: 3.0.0
File: bwgem-3.0.0.gem
复制代码
  • 然后将 bwgem-3.0.0.gem 推送到 RubyGems
gen push bwgem-3.0.0.gem
复制代码

猜你喜欢

转载自juejin.im/post/7073375517239410696