rails 迁移显然导致无限分叉
rails migration apparently causing infinite forking
我今天遇到了一个问题,到目前为止我还没有找到任何运气。我创建了一个新的迁移文件(通过 'rails g migrate ...')。创建文件后,当我运行railsdb:migrate或railsdb:migrate:status时,结果是rails好像是无限启动本身 - 即分叉。如果我删除新的迁移文件,这将不再发生 - 例如,rails db:migrate:status 导致状态报告显示和完成。为了在我 运行 迁移时验证 rails 正在分叉,我 运行 在一个单独的终端中:
while :; do date;echo ....................;pgrep -laf ruby; sleep 1; done
启动 'rails db:migrate' 后,上述命令会出现以下模式:
Tue Feb 26 09:59:59 CST 2019
....................
23799 /home/jtc/.rvm/rubies/ruby-2.3.0/bin/ruby bin/rails db:migrate:status
Tue Feb 26 10:00:02 CST 2019
....................
23799 /home/jtc/.rvm/rubies/ruby-2.3.0/bin/ruby bin/rails db:migrate:status
23819 ruby bin/rails db:test:prepare
23837 /usr/bin/ruby-mri /home3/development/jtc/projects/s-todo/src/main/initial-
processing.rb
Tue Feb 26 10:00:03 CST 2019
....................
23799 /home/jtc/.rvm/rubies/ruby-2.3.0/bin/ruby bin/rails db:migrate:status
23819 ruby bin/rails db:test:prepare
Tue Feb 26 10:00:04 CST 2019
....................
23799 /home/jtc/.rvm/rubies/ruby-2.3.0/bin/ruby bin/rails db:migrate:status
23819 ruby bin/rails db:test:prepare
23875 ruby bin/rails db:test:prepare
Tue Feb 26 10:00:06 CST 2019
....................
23799 /home/jtc/.rvm/rubies/ruby-2.3.0/bin/ruby bin/rails db:migrate:status
23819 ruby bin/rails db:test:prepare
23875 ruby bin/rails db:test:prepare
23886 ruby bin/rails db:test:prepare
如您所见,分叉的命令是 'ruby... db:test:prepare'。更多详细信息:
其他 rails(非 db:) 任务(到目前为止我已经尝试过的所有任务)产生相同的行为 - 即,当新的迁移文件就位时分叉,并且 运行ning通常当它不存在时。当我用运行 rails 服务器时,就不会出现这个问题。我相信只有在 运行ning rails/rake 任务时才会发生。此外,我怀疑我对 config/application.rb 所做的更改可能是导致它的原因。但是在尝试了该文件的几个旧版本(迁移未分叉的日期)并且 运行 遇到了同样的问题之后,我得出的结论是这可能不是一个因素。最后,我还注意到 rails 任务最近是 运行 测试框架 - 即,在 运行 的末尾(没有新的迁移文件),我看到了这个:
Progress: |====================================================================|
Run options: --seed 37369
# Running:
Finished in 0.00505s
0 tests, 0 assertions, 0 failures, 0 errors, 0 skips
Finished in 0.004874s, 0.0000 runs/s, 0.0000 assertions/s.
0 runs, 0 assertions, 0 failures, 0 errors, 0 skips
我强烈怀疑这两个问题是相关的。我已经开始调查自上次成功迁移(2 月 13 日)以来我所做的更改,但尚未发现任何可疑之处。
我相信你们都知道,我远不是 rails 专家。非常感谢任何关于在哪里寻找解决问题的线索或指示。
我假设你没有做一些明智的事情,比如使用 git 或一些东西来跟踪你的版本控制(如果是这样,只需回滚所有内容)。
以防万一我停止(或 kill
如果需要)任何 spring
那是 运行.
重新解决此问题,我建议创建一个新应用并复制您的迁移,然后 运行 将它们复制到新应用中,以确认这不是您的迁移。然后只需复制您的 app
和其他更改。然后安装并使用 git
或类似的东西来解决这样的小问题,以便将来解决 :)
好的,我找到问题的原因了。我想我会在这里回答我自己的问题,以防它帮助其他有类似问题的人。我发现当你 运行 一个 rails 任务时,你的所有任务都会被加载(我想是 lib/tasks/ 下的所有 *.rake 文件)。我决定隐藏我的 *.rake 文件(在 chmod 000 目录中)并一次恢复 1 或 2 个文件,以查明是否是其中一个文件导致了问题;并且,这样做,我找到了罪魁祸首 - 一个 rake 任务,它重新使用我的一些测试代码来创建一些模型实例,并将相应的记录插入数据库,以便 test/debug a(我称之为)我一直在努力的服务。显然,这就是为什么即使问题出现在开发模式下,测试框架仍然是 运行 - 因为所有的 rake 文件都被加载了,测试代码也被加载了......并且因为 ruby加载代码意味着正在执行一些代码,正在加载的测试代码必须导致测试环境的设置 - 而且,执行该 "borrowed" 测试代码必须触发一些循环依赖,导致一种无限递归和分叉。 (我没有调查它的确切原因,因为这可能需要一些时间并停止它涉及简单地注释掉有问题的代码,或删除 rake 文件。我最终用一个守卫包围了有问题的代码 - 即 "if ENV['ODD_ENV_VAR'] then ... end", 以便我在需要时仍然可以使用它。)
因此,对于看到相同症状的任何人 - 无限分叉 and/or 测试框架处于 运行 开发模式(或类似的奇怪问题),仅当 运行ning rails/rake 任务,我想说 rake 文件应该是第一个要看的地方,甚至在使用 'git checkout...' 之前为了查明问题是什么时候引入的。
我今天遇到了一个问题,到目前为止我还没有找到任何运气。我创建了一个新的迁移文件(通过 'rails g migrate ...')。创建文件后,当我运行railsdb:migrate或railsdb:migrate:status时,结果是rails好像是无限启动本身 - 即分叉。如果我删除新的迁移文件,这将不再发生 - 例如,rails db:migrate:status 导致状态报告显示和完成。为了在我 运行 迁移时验证 rails 正在分叉,我 运行 在一个单独的终端中:
while :; do date;echo ....................;pgrep -laf ruby; sleep 1; done
启动 'rails db:migrate' 后,上述命令会出现以下模式:
Tue Feb 26 09:59:59 CST 2019
....................
23799 /home/jtc/.rvm/rubies/ruby-2.3.0/bin/ruby bin/rails db:migrate:status
Tue Feb 26 10:00:02 CST 2019
....................
23799 /home/jtc/.rvm/rubies/ruby-2.3.0/bin/ruby bin/rails db:migrate:status
23819 ruby bin/rails db:test:prepare
23837 /usr/bin/ruby-mri /home3/development/jtc/projects/s-todo/src/main/initial-
processing.rb
Tue Feb 26 10:00:03 CST 2019
....................
23799 /home/jtc/.rvm/rubies/ruby-2.3.0/bin/ruby bin/rails db:migrate:status
23819 ruby bin/rails db:test:prepare
Tue Feb 26 10:00:04 CST 2019
....................
23799 /home/jtc/.rvm/rubies/ruby-2.3.0/bin/ruby bin/rails db:migrate:status
23819 ruby bin/rails db:test:prepare
23875 ruby bin/rails db:test:prepare
Tue Feb 26 10:00:06 CST 2019
....................
23799 /home/jtc/.rvm/rubies/ruby-2.3.0/bin/ruby bin/rails db:migrate:status
23819 ruby bin/rails db:test:prepare
23875 ruby bin/rails db:test:prepare
23886 ruby bin/rails db:test:prepare
如您所见,分叉的命令是 'ruby... db:test:prepare'。更多详细信息:
其他 rails(非 db:) 任务(到目前为止我已经尝试过的所有任务)产生相同的行为 - 即,当新的迁移文件就位时分叉,并且 运行ning通常当它不存在时。当我用运行 rails 服务器时,就不会出现这个问题。我相信只有在 运行ning rails/rake 任务时才会发生。此外,我怀疑我对 config/application.rb 所做的更改可能是导致它的原因。但是在尝试了该文件的几个旧版本(迁移未分叉的日期)并且 运行 遇到了同样的问题之后,我得出的结论是这可能不是一个因素。最后,我还注意到 rails 任务最近是 运行 测试框架 - 即,在 运行 的末尾(没有新的迁移文件),我看到了这个:
Progress: |====================================================================|
Run options: --seed 37369
# Running:
Finished in 0.00505s
0 tests, 0 assertions, 0 failures, 0 errors, 0 skips
Finished in 0.004874s, 0.0000 runs/s, 0.0000 assertions/s.
0 runs, 0 assertions, 0 failures, 0 errors, 0 skips
我强烈怀疑这两个问题是相关的。我已经开始调查自上次成功迁移(2 月 13 日)以来我所做的更改,但尚未发现任何可疑之处。
我相信你们都知道,我远不是 rails 专家。非常感谢任何关于在哪里寻找解决问题的线索或指示。
我假设你没有做一些明智的事情,比如使用 git 或一些东西来跟踪你的版本控制(如果是这样,只需回滚所有内容)。
以防万一我停止(或 kill
如果需要)任何 spring
那是 运行.
重新解决此问题,我建议创建一个新应用并复制您的迁移,然后 运行 将它们复制到新应用中,以确认这不是您的迁移。然后只需复制您的 app
和其他更改。然后安装并使用 git
或类似的东西来解决这样的小问题,以便将来解决 :)
好的,我找到问题的原因了。我想我会在这里回答我自己的问题,以防它帮助其他有类似问题的人。我发现当你 运行 一个 rails 任务时,你的所有任务都会被加载(我想是 lib/tasks/ 下的所有 *.rake 文件)。我决定隐藏我的 *.rake 文件(在 chmod 000 目录中)并一次恢复 1 或 2 个文件,以查明是否是其中一个文件导致了问题;并且,这样做,我找到了罪魁祸首 - 一个 rake 任务,它重新使用我的一些测试代码来创建一些模型实例,并将相应的记录插入数据库,以便 test/debug a(我称之为)我一直在努力的服务。显然,这就是为什么即使问题出现在开发模式下,测试框架仍然是 运行 - 因为所有的 rake 文件都被加载了,测试代码也被加载了......并且因为 ruby加载代码意味着正在执行一些代码,正在加载的测试代码必须导致测试环境的设置 - 而且,执行该 "borrowed" 测试代码必须触发一些循环依赖,导致一种无限递归和分叉。 (我没有调查它的确切原因,因为这可能需要一些时间并停止它涉及简单地注释掉有问题的代码,或删除 rake 文件。我最终用一个守卫包围了有问题的代码 - 即 "if ENV['ODD_ENV_VAR'] then ... end", 以便我在需要时仍然可以使用它。)
因此,对于看到相同症状的任何人 - 无限分叉 and/or 测试框架处于 运行 开发模式(或类似的奇怪问题),仅当 运行ning rails/rake 任务,我想说 rake 文件应该是第一个要看的地方,甚至在使用 'git checkout...' 之前为了查明问题是什么时候引入的。