Tag: thor

如何使用rspec测试CLI的stdin

我正在制作一个小型的Ruby程序,无法弄清楚如何编写模拟多个用户命令行输入的RSpec规范(function本身可行)。 我认为这个StackOverflow的答案可能涵盖了最接近我的地方,但这并不是我需要的。 我使用Thor作为命令行界面,但我不认为这是Thor的任何问题。 程序可以从文件或命令行读取命令,并且我已经能够成功编写测试以读取执行它们。 这是一些代码: cli.rb class CLI ” while line = gets break if line =~ /EXIT/i yield [line] print “> ” end end end # .. end 我已经成功测试了使用以下代码执行文件中包含的命令: 投机/ cli_spec.rb describe CLI do let(:cli) { CLI.new } subject { cli } describe “executing instructions from a file” do let(:default_file) { “instructions.txt” } let(:output) […]

可以在不调用Thor的情况下调用可执行的Thor驱动脚本吗?

我有一个基于Thor的Ruby脚本,但是我想将它作为一个gem部署在人们的bin目录中,人们可以在不需要做thor mytool情况下进行thor mytool 。 所以相反他们只是使用mytool 这可能吗? 我知道有可能使用vanilla optparse但如果可能,我宁愿使用Thor。 更新:这是我根据Thor页面上的示例使用的代码,但我收到以下错误: #!/usr/bin/env thor class App :list desc “install APP_NAME”, “install one of the available apps” method_options :force => :boolean, :alias => :string def install(name) user_alias = options[:alias] if options.force? # do something end # other code end desc “list [SEARCH]”, “list all of the available apps, limited […]

是否可以从Thor脚本中调用Git或其他命令行工具?

我发现在为我的Rails 3应用程序进行git提交之前和之后,我经常运行一系列例行的“清理”任务。 我正在考虑把这些东西放到Thor脚本中,但有一点我无法弄清楚是如何使用Thor(或Rake)来调用系统上的其他工具。 是否可以从Thor或Rake脚本中调用git log这样的命令,如果是这样,那是什么样的? 谢谢!

如何通过自制软件分发ruby脚本

如何通过自制软件部署简单的ruby脚本? 这是我尝试过的 在名为homebrew-foo的GitHub仓库中写了公式 # file https://github.com/foo/homebrew-foo/blob/master/foo.rb class Foo < Formula desc "A command line tool" url "https://github.com/foo/foo/archive/master.zip" version "5.0.1" def install bin.install "foo" lib.install Dir["lib/*"] end end 另一个存储库包含ruby脚本。 这些是文件 ./foo ./lib/libfile1.rb 这是脚本的作用 #!/usr/bin/env ruby require ‘./lib/libfile1.rb’ puts “came here” 问题是require失败。 $ brew install foo/foo/foo $ foo 导致此错误 /Users/user1/.rbenv/versions/2.4.1/lib/ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in require’: cannot load such file — ./lib/libfile1.rb […]

Thor&YAML输出为二进制?

我正在使用Thor并尝试将YAML输出到文件中。 在irb中,我得到了我的期望。 YAML格式的纯文本。 但是当Thor的一个方法的一部分,它的输出是不同的…… class Foo “Xavier”, “age” => 30} puts test # {“name”=>”Xavier”, “age”=>30} puts test.to_yaml # !binary “bmFtZQ==”: !binary |- # WGF2aWVy # !binary “YWdl”: 30 File.open(“data/config.yml”, “w”) {|f| f.write(test.to_yaml) } end end 有任何想法吗?

在Rails 3生成器中多次调用任务

我正在编写一个Rails 3生成器,它可以创建两个不同的模型。 这是我正在尝试做的一个非常简单的例子: def my_generator_task invoke “model”, [“foo”] invoke “model”, [“bar”] end 问题是Thor调用方法只调用一次任务,因此第二次调用“模型”任务永远不会发生,并且永远不会创建“bar”模型。 有没有人知道一个优雅的方法来实现这一点,最好是以一种不会破坏与发电机运行“rails destroy”的能力的方式?

输入密码后,Net :: SSH sudo命令挂起

我一直在尝试使用Thor编写一个小型库来帮助我快速创建新项目和站点。 我写了这个小方法: def ssh(cmd) Net::SSH.start( server_ip, user, :port => port) do |session| session.exec cmd end end 在需要时帮助我在远程服务器上运行快速命令。 问题是,当我需要在远程端的sudo下运行命令时,脚本似乎挂在我身上。 例如,当执行此…时 ssh(“sudo cp #{file_from_path} #{file_to_path}” ) 该脚本将提示我输入密码 [sudo] password for user: 但是输入之后整个事情就变成了笨蛋。 有人会碰巧知道为什么它会完全挂起,以及我可以做些什么来在Net :: SSH(或其他替代方案)下的远程服务器上运行sudo命令? *注意:在建议之前,我最初开始将这个库作为Capistrano下的食谱编写,直到我遇到Thor,并认为这是一个尝试它的好机会。 如果需要的话,我不反对将整个事情切换回Capistrano,但如果没有一种简单的方法在远程服务器上运行sudo命令,我会感到非常惊讶。