介绍
分享形成了所有参与者之间的桥梁,它使事情成长,这是开源运动的基础,它给出了空间,并允许这么多伟大的事情发生 - 特别是在最近几年。
这主要适用于基于Ruby和Ruby的应用程序,这就是为什么 - 以及如何 - 开发人员可以通过所有可用的工具,库和框架来快速实现他们的想法。
在这篇DigitalOcean文章中,我们旨在帮助那些试图通过分享他们自己的Ruby或Ruby相关创作来为社区寻找回报的方式的人,我们将为其他人提供包装代码的奥秘,以便通过RubyGems包装管理器轻松下载它。
词典
1、包装应用
2. RubyGems 包管理器和 Ruby Gem 包
- RubyGems 包管理器
- Ruby Gem 包
- Gem 包结构
获取Ruby和必要的工具
- 安装 Ruby
- 安装 Bundler
3. 包装一个 Ruby 应用程序
- 准备分发目录
- 创建一个.gemspec 文件
- 放置应用程序代码
- 修改主应用程序脚本
- 确保一切工作
- 列出你的宝石的依赖
- 承诺宝石包
4. 释放一个 Gem 包
- 创建包
- 发布宝石
包装应用
分发应用程序、库或其他与编程相关的代码包的一种方式是将其放置在名为 packages 的档案中。 应用程序包包含已编译和可用软件,以便于保持跟踪和易于使用的方式。
因此,包装应用程序包括遵循包装管理工具(即RubyGems)定义的设置格式,并使用这些工具以易于访问的方式与他人共享。
在本教程中,我们将开始理解RubyGems,宝石包格式,然后学习如何从开始到结束包装Ruby应用程序,从创建包结构开始,以包含代码(和其他相关材料)。
RubyGems 包管理器和 Ruby Gem 包
** 注: ** 本文的主题是包应用程序. 本节包含相关工具和材料的摘要. 有关这些工具和材料的更多信息,您可以阅读我们 RubyGems 系列的 介绍第一部分。
RubyGems 包管理器
RubyGems 是 Ruby 的默认 _package manager. 它有助于从下载到分发 Ruby 应用程序和相关二进制或库的所有应用程序包生命周期。
Ruby Gem 包装
Gem 是一个 Ruby 应用程序包,可以包含从代码集合到库和/或包装代码实际需要运行的依赖列表。
Gem 包装结构
宝石包包含不同的组件组合. 每个组件被放置在宝石包内的专用位置。
下面的所有元素(以及更多)都可以进入宝石:
- 应用程序代码;
- 测试;
- 依赖的描述;
- 二进制;
- 相关文档;
- 关于包的信息(gemspec)。
宝石由一个类似下列结构组成:
1/[package_name] # 1
2 |__ /bin # 2
3 |__ /lib # 3
4 |__ /test # 4
5 |__ README # 5
6 |__ Rakefile # 6
7 |__ [name].gemspec # 7
- [package_name]: Gem 包的主要根目录.
- /bin: 如果包有可执行的二进制文件的位置.
- /lib: 包含主要 Ruby 应用程序代码的目录(包括模块)。
- /test: 测试文件的位置.
- ** Rakefile:** 使用 Rake 构建的库的 Rake-file. 6._ [package name].gemspec: *.gemecsp file,具有主要目录的名称,包含所有包的 meta-data,例如版本
获取Ruby和必要的工具
安装 Ruby
如果您尚未安装 Ruby,您可以按照下面的两个链接之一,在您选择的平台上正确设置。
- CentOS / Rhel:
如何在 CentOS 6.5 上使用 RVM 安装 Ruby 2.1.0
- Ubuntu / Debian:
如何在 Ubuntu 13 上安装 Ruby 2.1.0 使用 RVM
安装Bundler
我们将使用的工具之一来创建宝石是 Bundler. 一旦Ruby,因此RubyGems安装在您的系统上,您可以使用gem
命令来获得 bundler。
运行以下操作以使用gem
安装bundler
:
1gem install bundler
2
3# Successfully installed bundler-1.5.3
4# Parsing documentation for bundler-1.5.3
5# Done installing documentation for bundler after 3 seconds
6# 1 gem installed
包装 Ruby 应用程序
有几种方法可以开始创建宝石包. 其中一种方法是使用流行的 Bundler,一个 Ruby 环境和依赖管理器,帮助应用程序的要求和代码的维护。
准备分销目录
珍珠包被保存在包目录中,应该以你的包命名,正如我们在上一节的结构中所讨论的那样。
运行以下命令,在一个文件夹中填写所有必要的目录,以您的宝石所需的名称命名:
1# Usage: [sudo] bundle gem [your chosen gem name]
2# Example:
3bundle gem my_gem
** 注意: ** 宝石名称必须是独一无二的,因此,您应该搜索并确保您想为您的宝石使用的名称尚未被别人的项目选择。
上面的命令将运行一系列命令来创建我们的包结构,例如:
1# bundle gem my_gem
2# create my_gem/Gemfile
3# create my_gem/Rakefile
4# create my_gem/LICENSE.txt
5# create my_gem/README.md
6# create my_gem/.gitignore
7# create my_gem/my_gem.gemspec
8# create my_gem/lib/my_gem.rb
9# create my_gem/lib/my_gem/version.rb
10# Initializing git repo in .../my_gem
正如你所看到的,Bundler 还创建了一个全新的 Git 存储库,它适用于各种版本操作。
** 注意:** 如果您想了解有关如何使用 Git 的更多信息,请参阅有关该主题的 DigitalOcean 社区文章。
创建一个.gemspec 文件
.gemspec 文件包含一些關於 Gem 包的絕對重要信息. 每個 Gem 都必須配送一個,從 Gem 名稱到版本和描述到 Gem 所包含的文件夾的元資料都可找到。
** 提示: **.gemspec 文件是常规的 Ruby 脚本,这意味着它们是可编程的。
要查看由Bundler创建的通用 gemspec 的内容,请使用以下命令:
1cat my_gem/my_gem.gemspec
2
3# # coding: utf-8
4# lib = File.expand_path('../lib', __FILE__)
5# $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
6# require 'my_gem/version'
7
8# Gem::Specification.new do |spec|
9# spec.name = "my_gem"
10# spec.version = MyGem::VERSION
11# spec.authors = ["Maintainer Name"]
12# spec.email = ["[email protected]"]
13# spec.summary = %q{TODO: Write a short summary. Required.}"
14# spec.description = %q{TODO: Write a longer description. Optional.}
15# spec.homepage = ""
16# spec.license = "MIT"
17
18# spec.files = `git ls-files -z`.split("\x0")
19# spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
20# spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
21# spec.require_paths = ["lib"]
22
23# spec.add_development_dependency "bundler", "~> 1.5"
24# spec.add_development_dependency "rake"
25# end
26# mba:Git
您可以现在编辑此文件,或在每次包装和发布之前。
若要修改此文件,您可以使用以下命令使用 nano 编辑它:
1nano my_gem/my_gem.gemspec
这将打开纳米文本编辑器。
您可能想在这里声明的建议附加信息之一是执行代码所需的最低 Ruby 解释器版本。
您可以使用 required_ruby_version
声明来做到这一点,该声明可以添加到文件的底部以获得一致性。
例如:
1# ..
2
3 # Declare that the Gem is compatible with
4 # version 2.0 or greater
5 spec.required_ruby_version = ">= 2.0"
6
7 spec.add_development_dependency "bundler", "~> 1.5"
8 spec.add_development_dependency "rake"
9end
一旦您完成了编辑文件,请按 CTRL + X 并用 Y 确认保存和退出。
** 注意:** 请不要忘记修改包含要做
字符号的声明(即 %q{TODO:
)如 spec.description
。
设置应用程序代码
您的图书馆(或应用程序,框架等)应始终进入/lib
目录. 该目录内部,将有一个 Ruby 脚本,以与您的宝石完全相同的方式命名。
推荐和最顺利的方式来放置您的应用程序代码是将其分成比特,并将其放置在一个目录中,在/lib
,在那里它们被使用并由my_gem.rb
向公众提供。
当你查看/lib
目录的内容时,你会看到主要的Ruby脚本和包含你的代码的目录已经准备好了:
1ls -l my_gem/lib
2
3# drwxr-xr-x 3 user staff 102 dd Mmm hh:mm my_gem
4# -rw-r--r-- 1 user staff 70 dd Mmm hh:mm my_gem.rb
在/lib
内部的my_gem
目录中包含一个版本文件:
1cat my_gem/lib/my_gem/version.rb
2
3module MyGem
4 VERSION = "0.0.1"
5end
这个版本
号码被设置为自动导入并使用Bundler的*.gemspec
文件中,您可以在这里修改它并更改它以匹配您的宝石的当前版本。
您应该将所有代码迁移到这里,以便您的应用程序使用。
作为一个例子,让我们创建一个Hello [name]!
模块。
1nano my_gem/lib/my_gem/hail.rb
把下面的例子放在里面:
1class Hail
2 def self.name(n = "Dalek")
3 n
4 end
5end
按 CTRL + X 并用 Y 确认保存和退出。
更改主应用程序脚本
在之前的步骤中,我们了解到,为了保持一切顺序,具有特别多的类的应用程序应该分成部分,所有元素都放置在/lib/[gem-name]
目录中。
让我们看看我们如何修改当有人使用您的宝石时被导入的主要 Ruby 脚本。
运行以下命令以使用 nano 编辑在 `/lib 中导入的 Ruby 文件:
1# Usage: [sudo] nano my_gem/lib/[gem name].rb
2nano my_gem/lib/my_gem.rb
你会看到一个非常短的脚本类似于下面的:
1require "my_gem/version"
2
3module MyGem
4 # Your code goes here...
5end
在这里,您应该从/lib/[gem name]
目录中导入所有类和代码,并使用它们。
在我们的案例中,让我们看看我们在上一步创建的Hail
类如何使用。
更改您的代码类似于下面的示例:
1require "my_gem/version"
2require "my_gem/hail"
3
4module MyGem
5 def self.hi(n = "Default Name")
6 hail = Hail
7 Hail.name(n)
8 end
9end
按 CTRL + X 并用 Y 确认保存和退出。
**注:虽然没有必要将Hail
变成一个可即时化类,但为了演示目的,我们已经这样做,并将MyGem作为一个模块直接使用其方法。
确保一切都起作用
一旦您将代码移动到内部并修改您的主要导入脚本,您将希望确保一切正常工作,当然。
首先,让我们进入 Gem 目录,然后使用 Bundler 的控制台功能:
1cd my_gem
2bundler console
这将使用*.gemspec
中的信息加载您的宝石,并让您开始工作,例如:
1bundler console
2
3# irb(main):001:0> MyGem.hi("Hello world!")
4# => "Hello world!"
列出你的宝石的依赖
在现实世界的场景中,很可能你的宝石本身将依赖于他人。
这些依赖性也列在*.gemspec
文件中。
运行以下命令以使用 nano 编辑文件:
1nano my_gem/my_gem.gemspec
在适当的区块中添加以下指令来列出依赖性:
1# Usage: spec.add_runtime_dependency "[gem name]", [[version]]
2spec.add_runtime_dependency "activesupport", [">= 4.0"]
按 CTRL + X 并用 Y 确认保存和退出。
** 注意: ** 您可以通过在 *.gemspec
文件上连续重复指令来列出所有必要的依赖。
承诺 Gem 包
一旦您的宝石准备发货,您应该委托 Git 存储库进行版本化。
使用以下命令与 Git 合作:
1git commit -m "Version 0.1.0"
接下来,Git将委托你的所有代码,并为你提供结果:
1# [master (root-commit) d4640b8] Version 0.1.0
2# 8 files changed, 104 insertions(+)
3# create mode 100644 .gitignore
4# create mode 100644 Gemfile
5# create mode 100644 LICENSE.txt
6# create mode 100644 README.md
7# create mode 100644 Rakefile
8# create mode 100644 lib/my_gem.rb
9# create mode 100644 lib/my_gem/version.rb
10# create mode 100644 my_gem.gemspec
释放一个 Gem 包
一旦你对你的宝石感到满意,你可以在RubyGems.org上向世界发布它。
** 注意:** 要释放你的代码,你需要有一个帐户在 https://rubygems.org/sign_up
。
创建包
一旦全部设置,您可以使用珠宝
工具创建包。
运行以下操作来创建您的包:
1# Usage: [sudo] gem build [gem name].gemspec
2# Example:
3gem build mygem.gemspec
4
5# Successfully built RubyGem
6# Name: my_gem
7# Version: 0.1.0
8# File: my_gem-0.1.0.gem
出版《珍珠》
无论如何,您都需要使用 RubyGems.org 帐户登录,所以让我们先这样做。
运行以下命令以使用gem
登录:
1gem push
输入您的电子邮件地址,然后您的密码登录。
** 注意:** 我们特别避免给宝石名称,以便我们只能登录而不执行进一步的操作。
为了简单地推动您的宝石,运行以下操作:
1# Usage: [sudo] gem push [gem file]
2# Example:
3gem push my_gem-0.1.0.gem
或者,您可以从 Bundler 的 Rake 任务中受益,您可以看到以下内容的完整列表:
1rake -T
- rake build:
构建 my_gem-0.0.1.gem 到 pkg 目录中
安裝: 安裝: 安裝:
构建和安装 my_gem-0.0.1.gem 到系统宝石
- rake release:
创建标签 v0.0.1 并将 my_gem-0.0.1.gem 推到 Rubygems
如果您拨打rake release
,您的包将被推到您的设置的Git帐户,然后到RubyGems.org,例如:
1rake build
2# my_gem 0.1.0 built to pkg/my_gem-0.1.0.gem.
3
4rake release
5
6# rake aborted!
7# Couldn't git push. `git push 2>&1' failed with the following output:
8
9# fatal: No configured push destination.
10# Either specify the URL from the command-line or configure a remote repository using
11
12# git remote add <name> <url>
要继续,添加远程 Git 帐户:
1# Usage: git remote add origin [email protected]:[user name]/[repository].git
2# Example:
3git remote add origin [email protected]:maintainer1/my_gem.git
然后同时使用rake
释放您的代码:
1rake release
2
3# ..
4# Pushed MyGem
你现在可以去RubyGems.org并检查你的宝石:
1http://www.rubygems.org/gems/[your gem name]