【问题标题】:Heroku rake tasks failing for Sinatra app with string arguments带有字符串参数的 Sinatra 应用程序的 Heroku rake 任务失败
【发布时间】:2012-12-17 09:18:04
【问题描述】:

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

task :create_db , [:db_id , :db_name]
task :destroy_db , [:db_id, :token] 

当我跑步时

heroku run rake -T

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

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

但是当我跑步时:

heroku run rake create_db['test', 'test database']

它响应以下错误:

(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>'

我不太确定为什么会失败,但我的猜测是它与字符串参数有关。正如你在上面看到的,它说“不知道如何构建任务'create_db [test',测试显示没有字符串。

知道如何让这个任务从命令行运行吗?

【问题讨论】:

  • 这绝对是字符串参数的问题。我已将它作为 create_db[test,test-db] 传递,它可以工作......显然字符串参数不能在 Heroku 上使用。

标签: ruby heroku sinatra rake


【解决方案1】:

这对我来说很有效

heroku run rake "namespace:task['var1','var2']"

【讨论】:

  • 这对你有用...所以 OP 应该尝试像heroku run rake "create_db['test', 'test database']" 这样的东西吗?
【解决方案2】:

原因

$ heroku run rake create_db['test', 'test database']

不工作是由于参数之间/内部的空间。以下将工作。

$ heroku run rake "create_db['test','test database']"

【讨论】:

    【解决方案3】:

    来自Rake docs

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

    rake "name[billy bob, smith]"
    

    (操作系统和 shell 之间的引用规则有所不同,因此请务必查阅适合您的操作系统/shell 的文档)。

    另请注意,您不需要引用各个参数。

    在您的情况下,这应该可以:

    rake "create_db[test, test database]"
    

    这也有效:

    rake create_db[test,'test database']
    

    注意第二个参数被引用了,但是逗号和引号之间没有空格,所以shell把整个东西当作一个单独的参数。

    在 Heroku 上

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

    您需要转义引号:

    heroku run rake \"create_db[test, test database]\"
    

    所以在 Dyno 上运行的命令是 rake "create_db[test, test database]";或引用引号:

    heroku run rake "create_db[test,'test database']"
    

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

    【讨论】:

    • 我把它贴在原问题里
    • @NickONeill 你的错误不会完全一样,至少在第二种情况下:Don't know how to build task 'create_db[test,test'。我已经更新了我的答案,并附上了关于如何让它在 Heroku 上运行的说明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 2011-04-26
    • 2013-09-10
    • 1970-01-01
    • 2016-03-09
    • 2012-08-30
    • 2013-01-08
    相关资源
    最近更新 更多