【问题标题】:Is there a way to automatically have a "rake db:migrate RAILS_ENV=test" after "rake db:migrate" in development environment?有没有办法在开发环境中的“rake db:migrate”之后自动有一个“rake db:migrate RAILS_ENV=test”?
【发布时间】:2011-08-03 16:31:15
【问题描述】:

在开发环境中,有没有办法在每个rake db:migrate 之后自动执行rake db:migrate RAILS_ENV=test

我有 guardguard-rspec 正在运行,我对失败的测试感到非常恼火,即使它在浏览器中手动运行也是如此。

每次我暂停开发至少要花费 15 分钟,才能弄清楚我只是在更改数据库后忘记致电 rake db:migrate:test

由于我已经在使用 guard,我考虑将 guard-rake 也添加到项目中,但我不知道应该查看哪个文件。在观看 development.sqlite3 时,每次我通过浏览器对我的记录进行操作时,rake db:migrate RAILS_ENV=test 都会被触发,所以这并不是我真正想要的。

有人可以帮我解决我的问题吗?

【问题讨论】:

    标签: ruby-on-rails-3 testing rspec2 guard


    【解决方案1】:

    可能只是在您的 .bashrc 文件中创建一个命令别名。

    ~/.bashrc

    alias rake_db_migrate='rake db:migrate db:test:prepare'
    

    终端

    $ rake_db_migrate
    

    【讨论】:

    • Args... 是的,就这么简单... 我暂时搁置这个问题。我希望会有更多的 ruby​​ 或 rails 方式来做到这一点。
    • 我也是用alias rake_db_migrate='rake db:migrate && rake db:migrate:test',所以只有当另一个迁移成功时才会迁移test-db
    • @NobbZ - 好电话,已添加到我的答案中。
    • 我被打得睡不着觉...由于没有db:migrate:test,任务命令行必须是alias rake_db_migrate='rake db:migrate && rake db:migrate RAILS_ENV=test'。已编辑答案,等待批准。
    • 直到现在我才懒得看其他帖子,但其他人已经建议了。
    【解决方案2】:

    我使用这个别名:
    alias rake_db_migrate='rake db:migrate && rake db:migrate RAILS_ENV=test'

    因为rake db:test:prepare 已被弃用。

    我使用它的原因是因为我们的项目使用 pg_search (postgreSQL) 以及 structure.sql(不是 schema.rb),并且由于某种原因运行 rake db:migrate 不会准备测试数据库。

    【讨论】:

      【解决方案3】:

      我更喜欢这样使用别名:

      在你的~/.bashrc

      alias migrate='rake db:migrate && rake db:test:prepare'
      

      花 30 分钟试图弄清楚为什么您的测试没有通过只是为了记住您没有重置数据库,这很容易。这将解决这个问题。

      【讨论】:

      【解决方案4】:

      更快:alias migrate='rake db:migrate db:test:prepare'(添加到你的.bashrc,它只会加载一次 Rails)

      【讨论】:

        【解决方案5】:

        我非常喜欢的一个选项是在另一个 rake 脚本中覆盖实际任务。这将在运行迁移后自动调用。像这样我总是在迁移数据库后创建一个 ERD 图:

        # lib/tasks/database.rake
        namespace :db do
          desc 'Additional migrate task that creates the diagram'
          task :migrate do
            if Rails.env.development?
              Rake::Task['diagram:erd'].invoke
            end
          end
        end
        

        所以在你的情况下:

        # lib/tasks/database.rake
        namespace :db do
          desc 'Additional migrate task that creates the diagram'
          task :migrate do
            `rake db:migrate RAILS_ENV=test`
          end
        end
        

        另一种方法是运行以下命令,将新架构克隆到测试数据库:

        rake db:migrate db:test:clone
        

        【讨论】:

        • 好问题。在我的情况下,它们位于lib/tasks/database.rake,它们将从那里动态加载。我已经相应地更新了我的问题。
        【解决方案6】:

        针对您最初使用guard-rake 的问题,您可以观看db/schema.rb,因为这将在您迁移数据库时更新。但是,如果您进行回滚,此文件也将被更改,因此您可能必须从db/schma.rb 的架构定义行中提取迁移版本,或者使用rake db:test:prepare 而不是rake db:migrate RAILS_ENV=test

        看起来这很脆弱,所以使用 shell 别名可能是更好的方法。我只是希望有更好的方法!

        【讨论】:

          【解决方案7】:

          如果您想将其作为一种行之有效的单线器,您可以将其设置为:

          echo "alias rake-migrate='rake db:migrate && rake db:migrate RAILS_ENV=test'" >> ~/.zshrc && source ~/.zshrc
          

          对于回滚有:

          echo "alias rake-rollback='rake db:rollback && rake db:rollback RAILS_ENV=test'" >> ~/.zshrc && source ~/.zshrc
          

          然后,在终端中运行

          rake-migrate
          

          rake-rollback
          

          注意:这将为~/.zshrc 文件添加一个别名。 注意 2::如果你这样做,比如说终端 1,并使用另一个终端选项卡或 vscode 终端,那么只需在你想要运行它的终端上运行 source ~/.zshrc

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-06-13
            • 2011-08-01
            • 2018-10-06
            • 1970-01-01
            • 1970-01-01
            • 2016-11-19
            相关资源
            最近更新 更多