TLDR; 只需编写代码,尽可能使用 RubyMine,一切都会好起来的。我在这里包括我自己的过程,但只是作为一个例子。
在 Ruby 中创建命令行工具
我使用 RubyMine 没有做任何 Rails 并且只是按照你的要求做。我编写了很多简单的脚本和大型应用程序,它们通常都可以从命令行使用。
我仍然将我的代码组织到一个“项目目录”中。并将 RM 指向该目录。而不是完全在一个文件中工作,并试图将 RM 单独指向文件。这似乎是 IDE 更喜欢的。这让 RM 创建它的.idea
目录来保存它的所有项目相关设置。
这可能意味着某些项目仅包含一个目录(用于项目)和该目录中的单个文件(单个脚本,它实际上是该项目中唯一的内容)。
项目目录的好处
无论如何,您很快就会发现您向任何项目添加了更多文件。额外的编码和各种实用程序都是 ruby 的巨大优势的一部分。
该project directory
模式还允许您使用流行的 VCS(例如 git)对代码进行版本控制,甚至可以上传到 github 等社交编码网站。
项目设置
我不关心任何类型的“项目类型”。事实上,我根本不使用 RubyMine 创建项目。我只是创建一个目录,然后用 RM 打开该目录(无论是从文件菜单,还是通过 RM 安装的“我的”命令行工具)。
project/
当然project
不是项目的真实名称,也不是我创建的目录,我这里只是作为一个通用名称。实际上,我会在他们所做的工作的脚本或主题之后命名目录(和项目)。
注意:目前mine
在 RM 5 中的命令中有一个错误,它不会打开第二个项目窗口。
显然,如果这是一个包含任何命令行脚本的项目,我会将它们放在一个bin
目录中,仅用于组织目的。我不喜欢用各种各样的东西把根项目目录弄得乱七八糟。项目根目录中需要设置文件的工具太多了,所以越少越好。
project/bin/
就像我说的,其他各种实用程序更喜欢项目根目录中的设置文件,因此您可能会发现自己使用其中的一些。
project/Gemfile
project/Rakefile
project/project.gemspec
project/README.md
project/.rdoc_options
...
一旦我对脚本进行了一些自动化测试(我承认这不是即时的),我将所有测试代码放在一个test
目录下,但我会根据测试范围或我在开发过程中运行它们的频率进一步对它们进行分类. 而且我会添加 quck Rake 任务,这些任务只是运行测试所需命令的别名。所以我不必记住哪个测试运行器,或者每次都输入完整的路径。
project/test/
project/test/unit/
project/test/unit/some_component_test.rb
project/test/integration/
最后,随着项目的增长,我添加了更多的脚本或者想在外部项目中重用一些代码,我将添加一个lib
目录,并使用一些标准实践来组织它。
project/lib/
project/lib/project.rb
随着项目的不断发展和变得越来越复杂,在进行一些重构之后,需要对内容进行更多的组织。请注意cmd
包含特定脚本可以通过的各种工作流的实际顶级代码的目录。
project/lib/project/
project/lib/project/other_stuff.rb
project/lib/project/cmd/
project/lib/project/cmd/one_command.rb
project/lib/project/cmd/another_command.rb
当然,原始project.rb
的“需要”所有这些 lib 文件。Ruby 加载速度非常快,因此我不会过多地管理同一项目中的 ruby 文件之间的依赖关系。它真的是关于代码可读性的。
更好的命令行应用程序
从单个脚本文件开始并编写最少的样板代码并没有错。这可能是最好的开始方式。
#!/usr/bin/env ruby
=begin
this is a script blah which does whatever
EXAMPLE
$ script <options> <arguments
=end
def main(args)
whatever
end
main(ARGV)
exit(0)
但是用 ruby 编写更好的命令行应用程序非常容易。有一些流行的 gem 可以为你处理很多基础设施。
你可以从像OptionParser这样简单的东西开始
然后,当您在脚本中构建更多代码时,您可以使用像美沙酮这样的 gem 升级到更多的基础设施
最后,当您编写完整的命令行应用程序时,使用许多“内部”命令(例如“git submodule init”),您可以升级到更重量级的东西,例如GLI
测试命令行应用程序
无论您编写哪种类型的应用程序,单元测试都几乎相同。您没有使用真正的服务或组合组件,而只是隔离内部组件并以纯内部方式使用它们。所以命令行工具没有太大变化。
但是当涉及到我的脚本的集成或完整的命令行测试时,我实际上是cucumber/aruba
. 我对 TDD 不感兴趣,对此我有点太务实了。但是对于命令行工具,一系列用例已经在可用的选项集中非常清楚地列出。即使对于交互式命令,这也使一系列feature
文件方便地兼作工具的文档。
Feature:
Create and manipulate notes in Evernote.
Background:
Given I am logged in as me
And I have 0 notes
Scenario: Show note
Given that I have 1 note named "foo" with content "bar"
When I run `rnote show note --title "foo"`
Then the output should contain "bar"
Scenario: Show note, from multiple notes
Given that I have 2 notes named "foo"
When I run `rnote show note --title "foo"` interactively
And I type "1"
Then the output should contain "foo"
安装
至于脚本的安装和打包,以便它们可以被世界其他地方共享和重用,只需看看你一直在 ruby 中使用的相同的“gem”实用程序。
您在编写要共享的新 gem 时创建的gemspec
内容可以被告知您的脚本和其他命令行实用程序。然后它将与您的其余代码一起包装它们,将它们安装在一个好的位置,甚至修复 PATH 以便用户可以在时间到来时找到它们。
事实上,这很好用,您的 gem 可以由这些bin
脚本组成。不包含其他可重用代码。
cat-dog是一个无害的小宝石,我为其他东西做了一个例子。它根本不包含 lib 目录,并且除了单个命令行脚本之外没有其他 ruby。
没有 Rails 的 Ruby
我遇到过很多不了解什么是Rails 和什么是ruby 的 Rails 开发人员。即当你移除 Rails 时剩下的东西。显然,服务器和模板、数据库、MVC 都消失了,添加到日常对象中的便利方法的一部分也消失了。
新的东西是你还剩下很多。如果你发现你错过了一些东西,很容易通过包含一两个宝石来添加它。例如,如果您喜欢使用像 active-record 这样的 ORM,它可以被包含回您的应用程序中,无需 Rails,无需大惊小怪。
require 'activerecord'
全功能 RubyMine
最后,在开发过程中更多地使用 RubyMine 功能。使用 rails 时可用的一切都可用于命令行应用程序。
您可以从 RM 运行命令并使用它的调试器,就像使用 rails 一样。就像任何 IDE 一样,您可以使用要测试脚本的参数设置“运行”配置文件,并通过 IDE 运行或调试脚本。就个人而言,我从不使用命令行调试器。如果我需要启动调试器来解决某些问题,那么我将在 IDE 中启动该程序。IDE 调试器的好处是“抬头”显示所有相关细节,并在执行过程中直观地跟踪脚本,这是不可替代的。