从RubyMine到Mac命令行应用程序?

rss*_*tmr 2 ruby macos command-line rubymine

我是一个相当有成就的开发人员,并且知道足够多的Ruby从几个多态方向射击我的脚.老实说,我对Rails没兴趣,并且想要使用Ruby作为Mac命令行脚本替代php或Python.我很难在哪里开始使用RubyMine.我想将RubyMine用于它的所有功能,我使用JetBrains的AppCode和IntelliJ,因此RubyMine看起来很简单.但我是否仅限于编写.rb文件并只是从终端命令行运行它们?我希望能够在不等待异常的情况下调试代码.

所以,我想我要求的是一个简单的清单,以获得命令行应用程序.哪个项目类型,我应该如何组织它,如何测试以及如何在RubyMine中运行?提前致谢.(我们曾经都是新手......)

Dra*_*Fax 10

TLDR; 只需编写代码,尽可能使用RubyMine,你会没事的.我在这里包含我自己的流程,但仅作为示例.

在Ruby中创建命令行工具

我使用RubyMine而不做任何导轨并按照你的要求做.我编写了很多简单的脚本和大型应用程序,它们通常都可以从命令行使用.

我仍然将我的代码组织到一个"项目目录"中.并将RM指向该目录.而不是仅仅完全在一个文件中工作,并试图单独指向RM文件.这似乎是IDE的首选.这使RM可以创建其.idea目录以保存其所有与项目相关的设置.

这可能意味着某些项目只包含一个目录(用于项目)和该目录中的单个文件(单个脚本实际上是该项目中的唯一内容).

项目目录的好处

您很快就会发现无论如何都要向任何项目添加更多文件.附加编码和各种实用程序都是ruby的巨大优势的一部分.

  • 宝石
  • 测试

project directory模式还允许您使用流行的VCS(如git)对代码进行版本化,甚至可以上传到github等社交编码网站.

项目设置

我不打扰任何"项目类型".实际上我根本不用RubyMine创建项目.我只是创建一个目录,然后用RM打开该目录(无论是从文件菜单,还是通过RM安装的"我的"命令行工具).

project/

当然project不是项目的真实名称,也不是我创建的目录,我只是在这里使用它作为通用名称.我实际上会在脚本或他们所做工作的主题之后命名目录(和项目).

注意:目前mineRM 5 中的命令中存在一个错误,它不会打开第二个项目窗口.

显然,如果这是一个包含任何命令行脚本的项目,我会将它们放在bin目录中,仅用于组织目的.我不喜欢用各种各样的东西搞乱根项目目录.有太多的工具需要在项目根目录中设置文件,因此越少越好.

project/bin/

就像我说的,各种其他实用程序更喜欢项目根目录中的设置文件,因此您可能会发现自己正在使用它们中的一些.

project/Gemfile
project/Rakefile
project/project.gemspec
project/README.md
project/.rdoc_options
...
Run Code Online (Sandbox Code Playgroud)

一旦我对脚本进行了一些自动化测试(我承认不是立即的)我将所有测试代码放在一个test目录下,但我会根据测试范围或在开发过程中运行它们的频率进一步分类.我甚至会添加quck Rake任务,这些任务只是运行测试所需命令的别名.所以我不必记住哪个测试运行器,或者每次都输入完整的路径.

project/test/
project/test/unit/
project/test/unit/some_component_test.rb
project/test/integration/
Run Code Online (Sandbox Code Playgroud)

最后,随着项目的发展,我添加更多脚本或想要重用外部项目中的一些代码,我将添加一个lib目录,并使用一些标准实践来组织它.

project/lib/
project/lib/project.rb
Run Code Online (Sandbox Code Playgroud)

随着项目的不断发展和变得越来越复杂,经过一些重构后,需要对内容进行更多的组织.请注意该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
Run Code Online (Sandbox Code Playgroud)

当然原始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)
Run Code Online (Sandbox Code Playgroud)

但是在ruby中编写更好的命令行应用程序非常容易.有一些流行的宝石可以为您处理大量的基础设施.

您可以从像OptionParser这样简单的事情开始

然后,当您在脚本中构建更多代码时,您可以使用像Methadone这样的宝石逐渐进入更多基础架构

最后,当您编写完整的命令行应用程序时,使用许多"内部"命令,如"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"
Run Code Online (Sandbox Code Playgroud)

安装

至于脚本的安装和打包,以便它们可以被世界其他地方共享和重用,只需使用相同的'gem'实用程序,你已经在ruby中一直使用它来实现依赖性.

gemspec你写一个新的宝石共享创建的时候,可以告诉你的脚本和其他命令行工具.然后它会用其余代码将它们包装起来,安装在一个好位置,甚至修复PATH,以便用户可以在时机到来时找到它们.

实际上这很好用,你的宝石可以只由这些bin脚本组成.没有包含其他可重用的代码.

猫狗是一种无害的小宝石,我把它作为其他东西的一个例子.它根本不包含lib目录,除了单个命令行脚本之外没有其他ruby.

没有Rails的Ruby

我遇到了很多Rails开发人员,他们并不知道什么 Rails,什么 ruby.即你删除Rails时剩下的东西.显然,服务器和模板化,数据库化,MVC都已经消失了,添加到日常对象的一部分便利方法也是如此.

新的商品是你还有很多东西.如果你发现你错过了什么东西,很容易通过包含一两颗宝石来重新添加它.例如,如果您喜欢使用像活动记录这样的ORM,那么可以将其包含在您的应用程序中,无需使用轨道,只需轻轻一点.

require 'activerecord'
Run Code Online (Sandbox Code Playgroud)

全功能RubyMine

最后,在开发过程中使用RubyMine功能更多.使用rails时可用的所有内容都可用于命令行应用程序.

您可以从RM运行命令,并使用与rails相同的调试器.就像任何IDE一样,您可以使用要测试脚本的参数设置"运行"配置文件,并通过IDE运行或调试脚本.就个人而言,我从不使用命令行调试器.如果我需要启动调试器来解决某些问题,那么我将在IDE中启动该程序.IDE调试器的好处是"抬头"显示所有相关细节,并通过执行直观地跟踪脚本,这是不可替代的.