如何从Rails应用程序中完全删除Yarn?

时间:2018-10-20 12:35:19

标签: ruby-on-rails configuration yarnpkg

我正在使用jQuery和其他一些库来构建Rails 5.1.x Rails应用程序。 Rails坚持要使用Yarn,这在开发机器上很好用,但我不能在生产中使用它。

有没有一种方法可以让Rails默认不使用Yarn?删除yarn.locknode_modules及其附带的所有其他内容。

4 个答案:

答案 0 :(得分:2)

创建Rails项目时,可以将--skip-yarn添加为rails new app_path --skip-yarn

答案 1 :(得分:1)

在Rails 5.2.x和6.0.x中,如果使用--skip-yarn标志创建新的Rails应用程序,它仍会添加检查是否安装了yarn。 因此,当您运行rails webpacker:install时,结果可能是

Yarn not installed. Please download and install Yarn from https://yarnpkg.com/lang/en/docs/install/

解决方案是在Rails.application.load_tasks之后的Rakefile末尾添加这四行:

# Replace yarn with npm
Rake::Task['webpacker:yarn_install'].clear
Rake::Task['webpacker:check_yarn'].clear
Rake::Task.define_task('webpacker:verify_install' => ['webpacker:check_npm'])
Rake::Task.define_task('webpacker:compile' => ['webpacker:npm_install'])

这将删除对纱线的检查,并且您只能使用webpack。

编辑: 如果您使用资产编译,或者想要管理客户端库,例如React,Angular或Vue,我实际上会建议使用 yarn 而不是npm,因为Rails 6似乎与纱线紧密集成在一起。它将在服务器启动以及资产编译时调用yarn。您不必接受用npm替换yarn的艰苦工作,而只需接受Rails repo开发人员的选择。

答案 2 :(得分:1)

谨记任何将来阅读此问题的人:Max Popoff's answer仅在您首先定义其Rakefile中引用的新rake任务时才有效。关于blog post的更多信息,但是本质上,您需要添加如下文件:

# lib/tasks/webpacker.rake

namespace :webpacker do
  task :check_npm do
    begin
      npm_version = `npm --version`
      raise Errno::ENOENT if npm_version.blank?
      version = Gem::Version.new(npm_version)

      package_json_path = Pathname.new("#{Rails.root}/package.json").realpath
      npm_requirement = JSON.parse(package_json_path.read).dig('engines', 'npm')
      requirement = Gem::Requirement.new(npm_requirement)

      unless requirement.satisfied_by?(version)
        $stderr.puts "Webpacker requires npm #{requirement} and you are using #{version}" && exit!
      end
    rescue Errno::ENOENT
      $stderr.puts 'npm not installed'
      $stderr.puts 'Install NPM https://www.npmjs.com/get-npm' && exit!
    end
  end

  task :npm_install do
    system 'npm install'
  end
end

答案 3 :(得分:0)

从文件中删除以下行

bin / setup.rb和bin / update.rb

-  # Install JavaScript dependencies if using Yarn
-  system('bin/yarn')

config / initializers / assets.rb

# Add Yarn node_modules folder to the asset load path.
Rails.application.config.assets.paths << Rails.root.join('node_modules')