设置一个新的 Ruby 项目
要启动 Ruby 项目,您不需要做任何事情,只需将一些 Ruby 代码放入文件中并使用 调用它即可ruby program.rb
。
然而,随着项目的发展,您可能会添加依赖项和测试。您可以通过文档来缓解这种情况——告诉用户需要拉取哪些 gem,以及哪些文件包含测试套件——但这很快就会变得难以处理。更好的方法是依靠生态系统工具来指定和自动化您的构建步骤。
要继续学习,你需要安装Ruby。撰写本文时,最新版本为 2.7.0。
编辑:如果您不想从头开始执行此操作,请尝试bundler gem
:
创建目录
不要将 Ruby 源代码散布到你的主目录中,保持项目独立。创建一个目录:
$ mkdir ruby_project
用你喜欢的编辑器打开这个目录。这篇文章的其他内容都放在这里。
添加捆绑器
要管理依赖项,请使用Bundler。此工具允许您指定运行项目所需的 gem,并允许用户发出单个bundle install
命令来拉取任何所需的 gem。
首先,安装你还没有的 gem:
$ gem install bundler
然后,在项目根目录中创建一个名为 的文件Gemfile
。目前,我们只需指定软件包存储库 URL:
source 'https://rubygems.org'
由于我们需要依赖项,我们将在此行下面添加它们。
添加测试文件
我们需要的第一个依赖项是用于测试的。本例使用minitest。将其添加到你的Gemfile
:
source 'https://rubygems.org'
+ gem 'minitest'
现在您可以调用bundle install
它来自动下拉。执行此操作后,Gemfile.lock
将生成一个名为 的新文件,其中包含正在使用的特定软件包版本。
这实际上取决于你,但我喜欢将我的测试保存在单独的子目录中:
$ mkdir test
在此文件夹中创建一个名为的文件,test/cool_program_test.rb
其内容如下:
# frozen_string_literal: true
require 'minitest/autorun'
require_relative '../lib/cool_program'
# Test program coolness
class CoolProgramTest < Minitest::Test
def test_coolness_off_the_charts
# skip
assert_equal CoolProgram.new.coolness, 11
end
end
第一行,# frozen_string_literal: true
,是一个神奇的注释,有点像Object.freeze
对每个字符串字面量进行调用。这样做是出于性能方面的考虑,但你可以通过在给定字符串前添加一个字符来取消调用+
。+'my newly mutable string literal'
现在你可以这样做了my_str << some_other_str
。不过,在 Ruby 中,我发现自己不会像这样操作字符串。
我们知道第一行就能用到minitest
依赖,因为我们用 Bundler 指定了它。不过实际的源代码还不存在!
添加实现文件
这也是个人喜好,但将您的实现保存在单独的子目录中也是一个明智的想法:
$ mkdir lib
创建我们拉入测试文件的文件,lib/cool_program.rb
内容如下:
# frozen_string_literal: true
# The coolest program
class CoolProgram
attr_reader :coolness
def initialize
@coolness = 11
end
end
puts "Coolness: #{CoolProgram.new.coolness}/10"
太棒了!一切就绪。
添加 Rakefile
现在,我们可以直接引导用户ruby
在正确的文件上调用它们——ruby lib/cool_program.rb
运行程序或ruby test/cool_program_test.rb
进行测试。如果我们能指定这些路径并将其抽象成test
或run
操作就更好了。这就是它rake
的用途!这个工具很像 GNU Make,只不过是针对 Ruby 的。
首先,将其添加到您的Gemfile
:
source 'https://rubygems.org'
gem 'minitest'
+ gem 'rake'
然后,在项目根目录中添加一个名为的新文件Rakefile
:
task default: %w[test]
task :run do
ruby 'lib/cool_program.rb'
end
task :test do
ruby 'test/cool_program_test.rb'
end
如果你知道make
它的工作原理,那么它和上面的类似(如果你不知道,我已经帮你讲解过了)。第一行定义了默认任务,或者说,当你调用时rake
没有指定具体任务时会发生什么。在本例中,我们只是让它将test
任务作为依赖项运行,本身没有块。这是一个列表,你可以在这里指定多个任务。
下面的每个任务都可以直接在命令行调用 - 您可以用它rake run
来实际执行您的程序,也可以单独rake
运行测试套件。
添加 Linter
我已经相当依赖Rubocop linter 来确保我符合Ruby 代码风格指南。它现在附带了一个随时可用的 Rake 任务。
首先,将其添加到您的Gemfile
:
source 'https://rubygems.org'
gem 'minitest'
gem 'rake'
+ gem 'rubocop'
然后,修改您的Rakefile
:
+ require 'rubocop/rake_task'
- task default: %w[test]
+ task default: %w[lint test]
+ RuboCop::RakeTask.new(:lint) do |task|
+ task.patterns = ['lib/**/*.rb', 'test/**/*.rb']
+ task.fail_on_error = false
+ end
task :run do
ruby 'lib/cool_program.rb'
end
task :test do
ruby 'test/cool_program_test.rb'
end
我个人倾向于默认运行 linter 和测试器,但不会因为 lint 错误而失败。请根据个人喜好调整。
可选 - 添加 GitHub 操作
我几乎所有的代码都托管在 GitHub 上,并且已经成为 GitHub Actions 的忠实粉丝。使用 YAML,你可以在提交或打开 PR 时让 GitHub 自动运行你的测试。在以下位置创建一个新文件<project root>/.github/workflows/ruby.yml
:
name: Ruby
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Ruby 2.7
uses: actions/setup-ruby@v1
with:
ruby-version: 2.7.x
- name: Build and test with Rake
run: |
gem install bundler
bundle install --jobs 4 --retry 3
bundle exec rake
您可以在这里轻松调整每个步骤 - 指定的命令将会运行,如果一切顺利完成且没有错误,您将获得一个绿色的勾号。太棒了!使用rake
可以让这个文件保持简洁,然后您就可以在 Rakefile 中管理结构的更改,而无需担心这个文件。
添加 README 和其他内容
我们即将完成,但您应该始终包含一份自述文件:
# ruby_project
The coolest dang program that you ever did see.
## Dependencies
* [Ruby](https://www.ruby-lang.org/en/). Written with version [2.7.0](https://www.ruby-lang.org/en/news/2019/12/25/ruby-2-7-0-released/) - *[docs](https://docs.ruby-lang.org/en/2.7.0/)*.
## Usage
Install deps: `gem install bundler && bundle install`. Run `bundle exec rake` to run the tests, or `bundle exec rake run` to run the program.
添加.gitignore
:
*.gem
*.rbc
/.config
/coverage/
/InstalledFiles
/pkg/
/spec/reports/
/spec/examples.txt
/test/tmp/
/test/version_tmp/
/tmp/
## Environment normalization
/.bundle/
/vendor/bundle
/lib/bundler/man/
# Used by RuboCop. Remote config files pulled in from inherit_from directive.
.rubocop-https?--*
您可能还应该添加一个 LICENSE 文件 - 这是BSD-3-Clause:
Copyright 2020 Coolness McAwesome
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
最后,您的目录应如下所示:
$ tree
.
|____Gemfile.lock
|____.gitignore
|____.github
| |____workflows
| | |____ruby.yml
|____Gemfile
|____LICENSE
|____Rakefile
|____test
| |____cool_program_test.rb
|____README.md
|____lib
| |____cool_program.rb
最后,git init && git add . && git commit -m "Initial commit"
祝您黑客愉快!
如果您不觉得有必要从头开始做这件事,那么您可以使用这个 GitHub 模板和这篇文章中的代码。
照片由 Jukan Tateisi 在 Unsplash 上拍摄
鏂囩珷鏉ユ簮锛�https://dev.to/decidously/setting-up-a-fresh-ruby-project-56o4
未找到评论