Heroku rake任务使用字符串参数无法使用Sinatra app

Nic*_*ill 7 ruby rake heroku sinatra

我刚刚将一个Sinatra应用程序部署到heroku,该应用程序包含两个rake任务:

task :create_db , [:db_id , :db_name]
task :destroy_db , [:db_id, :token] 
Run Code Online (Sandbox Code Playgroud)

我跑的时候

heroku run rake -T
Run Code Online (Sandbox Code Playgroud)

在控制台中,Heroku打印以下响应:

(in /app)
rake create_db[db_id,db_name]  # Creation count database task
rake destroy_db[db_id,token]   # Destroy database task
Run Code Online (Sandbox Code Playgroud)

但是,当我跑:

heroku run rake create_db['test', 'test database']
Run Code Online (Sandbox Code Playgroud)

它响应以下错误:

(in /app)
rake aborted!
Don't know how to build task 'create_db[test,'
/usr/local/lib/ruby/1.9.1/rake.rb:1720:in `[]'
/usr/local/lib/ruby/1.9.1/rake.rb:2040:in `invoke_task'
/usr/local/lib/ruby/1.9.1/rake.rb:2019:in `block (2 levels) in top_level'
/usr/local/lib/ruby/1.9.1/rake.rb:2019:in `each'
/usr/local/lib/ruby/1.9.1/rake.rb:2019:in `block in top_level'
/usr/local/lib/ruby/1.9.1/rake.rb:2058:in `standard_exception_handling'
/usr/local/lib/ruby/1.9.1/rake.rb:2013:in `top_level'
/usr/local/lib/ruby/1.9.1/rake.rb:1992:in `run'
/usr/local/bin/rake:31:in `<main>'
Run Code Online (Sandbox Code Playgroud)

我不太清楚为什么会失败,但我的猜测是它与字符串参数有关.正如您在上面所看到的,它表示"不知道如何构建任务'create_db [test,'测试显示没有字符串.

知道如何从命令行运行此任务吗?

mat*_*att 17

来自Rake文档:

rake任务名称及其参数需要是rake的单个命令行参数.这通常意味着没有空间.如果需要空格,则应引用整个rake +参数字符串.像这样的东西:

rake "name[billy bob, smith]"
Run Code Online (Sandbox Code Playgroud)

(引用规则因操作系统和shell而异,因此请务必查阅适用于您的OS/shell的文档).

另请注意,您无需引用各个参数.

在你的情况下,这应该工作:

rake "create_db[test, test database]"
Run Code Online (Sandbox Code Playgroud)

这也有效:

rake create_db[test,'test database']
Run Code Online (Sandbox Code Playgroud)

请注意,引用了第二个参数,但逗号和引号之间没有空格,因此shell将整个事件视为单个参数.

在Heroku上

这不起作用heroku run,因为在这种情况下,命令由shell解释两次,一次由你自己解释,再次在Heroku Dyno上,所以你需要确保Heroku运行的命令具有正确的引号.

你需要逃避报价:

heroku run rake \"create_db[test, test database]\"
Run Code Online (Sandbox Code Playgroud)

这样命令在Dyno上运行rake "create_db[test, test database]"; 或引用引号:

heroku run rake "create_db[test,'test database']"
Run Code Online (Sandbox Code Playgroud)

以便运行的命令是rake create_db[test,'test database'].