在什么情况下会从父进程获取 Ruby $LOAD_PATH?

发布于 2024-10-16 08:28:34 字数 653 浏览 2 评论 0原文

在我的 Cucumber 场景中,如果我在目标 Rails 应用程序文件夹中调用 rake db:schema:load ,我会得到 Cucumber 进程的 $LOAD_PATH 而不是 Rails 应用程序自己的 Gemfile/load 路径。我觉得这很奇怪。

结果是我收到以下错误:

no such file to load -- rails/all

我无法在黄瓜场景之外重现它。

ruby -rubygems -e "system 'rake -T'"

工作正常-> “rake -T”具有应用程序自己的基于 Gemfile 的 $LOAD_PATH;并且不会产生上述错误。

谁能想到为什么子进程(rake -Trake db:schema:loadrails runner...; 由 < code>system、exec%x[...] 或反引号将从父进程的 $LOAD_PATH 开始(来自 cucumber 场景的 Gemfile)而不是它自己的 $LOAD_PATH (来自 Rails 应用程序的 Gemfile)?

In my cucumber scenarios, if I call rake db:schema:load within a target Rails app folder, I get the cucumber process's $LOAD_PATH and not the Rails app's own Gemfile/load path. I think this is very weird.

The consequence is that I get the following error:

no such file to load -- rails/all

I can't reproduce it outside of my cucumber scenario.

ruby -rubygems -e "system 'rake -T'"

works normally -> the 'rake -T' has the application's own Gemfile-based $LOAD_PATH; and doesn't generate the error above.

Can anyone think why a child process (rake -T or rake db:schema:load or rails runner...; invoked by either system, exec, %x[...] or backtick; would start with the parent processes' $LOAD_PATH (from the cucumber scenario's Gemfile) instead of its own $LOAD_PATH (from the Rails app's Gemfile)?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

谁与争疯 2024-10-23 08:28:34

当您使用bundle时,无论是通过bundle execrequire 'bundler/setup',它都会找到您的Gemfile,然后将其位置放入ENV["BUNDLE_GEMFILE"]中。但是,如果已经设置,则捆绑器只会重用该值。这就是导致 Rails 应用程序使用 Cucumber 进程的 Gemfile 的原因。

如果您想在不同 Gemfile 的上下文中执行某些操作,请先清除 ENV["BUNDLE_GEMFILE"]。 Bundler 提供的方法 Bundler.with_clean_env(&blk) 可能会有所帮助;它会使用加载 Bundler 之前的环境来执行您的块。当然,您也可以使用 system("env -u BUNDLE_GEMFILE rake sometask") 之类的方法手动清除它。

When you use bundler, either via bundle exec or require 'bundler/setup', it finds your Gemfile, then puts its location in ENV["BUNDLE_GEMFILE"]. However, if this is already set, then bundler just reuses the value. This is what causes your Rails app to use the cucumber process's Gemfile.

If you want to execute something in the context of a different Gemfile, clear out ENV["BUNDLE_GEMFILE"] first. Bundler provides the method Bundler.with_clean_env(&blk) that may be helpful; it executes your block with the environment how it was before Bundler was loaded. Of course, you can also clear it out by hand with something like system("env -u BUNDLE_GEMFILE rake sometask").

鲸落 2024-10-23 08:28:34

父进程的环境 (ENV) 被传递到子 shell。 Cucumber 本身、您运行 Cucumber 的方式(例如 bundle exec cucumber)、您的场景或场景加载的代码(例如应用程序,因此捆绑器)都会扰乱您的 ENV< /代码>。 RUBYLIBGEM_PATHBUNDLE_GEMFILE 等环境变量可能会对子 shell Ruby 进程可以加载的行为产生重大影响。

尝试打印场景中的 ENV 变量,并将其与使用 ruby -rubygems -rpp -e "pp ENV" 执行此操作时得到的结果进行比较,或者只是 < code>env 在命令行上。

就其价值而言,一种可能的替代方案是直接加载并调用 rake 任务,例如,Rake::Task['db:schema:load'].invoke,而不使用子 shell 。不过,这取决于您想要做什么。

The parent process's environment (ENV) is passed down to sub-shells. Either cucumber itself, how you are running cucumber (e.g. bundle exec cucumber), your scenarios, or code the scenario loads (e.g. the app, and therefore bundler), is messing with your ENV. Environment variables like RUBYLIB, GEM_PATH, and BUNDLE_GEMFILE can have a significant impact on what your sub-shelled Ruby processes can load / will behave.

Try printing out your ENV variable in your scenario and comparing it to what you get when you do it with ruby -rubygems -rpp -e "pp ENV", or just env on the command line.

For what it's worth, a possible alternative would be to load and invoke the rake task directly, e.g., Rake::Task['db:schema:load'].invoke, without using a sub-shell. Depends on what you're trying to do, though.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文