Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用和不使用bundle exec运行rake命令的区别_Ruby On Rails_Ruby_Rake_Bundle - Fatal编程技术网

Ruby on rails 使用和不使用bundle exec运行rake命令的区别

Ruby on rails 使用和不使用bundle exec运行rake命令的区别,ruby-on-rails,ruby,rake,bundle,Ruby On Rails,Ruby,Rake,Bundle,使用和不使用bundle exec运行rake命令的主要区别是什么 我看到一些帖子说,当您使用bundle exec运行命令时,它将在gem文件中定义的gems版本的范围内运行。如果是这种情况,则必须使用bundle exec运行rake命令。bundle exec rake some:task在包的上下文中运行rake任务 您没有明确提到Rails,但我看到您的帖子被标记为Rails,因此一个做作的例子可能如下所示: 您的系统上安装了虚构的whateva whatevagem的2.0版,原因是

使用和不使用bundle exec运行rake命令的主要区别是什么


我看到一些帖子说,当您使用bundle exec运行命令时,它将在gem文件中定义的gems版本的范围内运行。如果是这种情况,则必须使用
bundle exec
运行rake命令。

bundle exec rake some:task
在包的上下文中运行rake任务

您没有明确提到Rails,但我看到您的帖子被标记为Rails,因此一个做作的例子可能如下所示:

您的系统上安装了虚构的
whateva whateva
gem的2.0版,原因是合理的

您决定从某个地方拉下一个旧的Rails项目,将其签出,并在克隆项目的根文件夹中运行
bundle install
。该命令将安装Rails应用程序所需的所有gem,其中一个恰好是虚构的
whateva-whateva
gem的verison 1.0

因此,当前的状态是:您的旧rails应用程序有一个gem捆绑包,其中包括较旧版本的
whateva whateva
,您的系统范围gem包括较新版本的
whateva whateva
gem

当您运行与Rails应用程序关联的rake任务时,您希望加载哪个版本?当然是老一点的

为了做到这一点,您可以使用bundle exec rake:task,它在bundle的上下文中运行rake命令——旧版本的gem加上旧rails应用程序的gem文件中指定的任何其他内容

所以,是的,在所有这些之后,我认为可以肯定地说,最好的做法是,您应该总是预先编写
bundle exec
,但老实说,我很懒,除非看到问题,否则很少这样做


在其他新闻中,如果您使用Bundler的binstubs,则不需要添加它。这里有一个设置的链接:

BUNDLE\u GEMFILE=/path/to/GEMFILE BUNDLE exec
可以用于任何命令之前(如果未指定
BUNDLE\u GEMFILE
,它会搜索文件系统并使用它找到的第一个),而不仅仅是
rake

您运行的任何命令都可能调用可执行的Ruby命令(例如
rake
),或者需要Ruby库中的代码(例如
rake::Task
类),这些东西通常由gems提供<代码>gem env告诉您gem提供的库和可执行文件在哪里。但是,如果使用
bundle exec
,则会将可用的gem限制为与
Gemfile
关联的
Gemfile.lock
文件中指定的gem,而
bundle exec
上下文正在使用

使用计算机上所有可用的gem(如果您不执行
bundle exec
,可能会发生这种情况)可能是不可取的,原因如下:

  • 您的完整gem集合中可能存在不兼容
  • 很难准确地说出你在使用什么宝石,这给你的工作环境增加了一些不可预测性
这里有一个快速的方法可以看出区别

  • gem安装精简版
  • 创建一个目录
    foo
    ,其中包含两个文件:一个是空文件,另一个是包含以下内容的文件
    foo.rb
    #/usr/bin/ruby(或任何指向系统ruby的路径)

    要求“精简”
  • 使
    foo.rb
    可执行
  • 请注意,从命令行运行
    thin
    /foo.rb
    都可以,但是前面的
    bundle exec
    都不起作用

  • 如果在rails中的任何命令之前使用
    bundle exec
    ,它将在应用程序主文件夹中搜索GEM文件中提到的GEM

    假设您有两个应用程序,每个应用程序使用不同的ruby版本。 如果没有bundle exec,该命令可能无法运行,因为运行该任务可能需要不同版本的Gem。但是如果您开始使用
    bundle exec
    ,则运行任务/应用程序将需要确切的gem版本


    我建议您在任何命令之前使用**bundle exec**。

    bundle exec-在bundle的上下文中执行命令

    此命令执行该命令,使Gemfile(5)中指定的所有gem都可用于Ruby程序中

    它不是唯一的rake,而是同样适用于rails、rspec和rackup命令

    基本上,如果您通常运行rspec spec/my_spec.rb之类的程序,并且希望使用Gemfile(5)中指定并通过bundle install(1)安装的gem,那么您应该运行bundle exec rspec spec/my_spec.rb

    请注意,bundle exec并不要求shell的$PATH上有可执行文件

    有关更多详细信息,请查看文档