繁体   English   中英

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

[英]How to remove Yarn from a Rails app completely?

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

有没有办法让 rails 默认不使用 Yarn? 删除yarn.locknode_modules以及它附带的所有其他内容。

从文件中删除以下行

bin/setup.rb 和 bin/update.rb

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

配置/初始化程序/assets.rb

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

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

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

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

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

# 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 深度集成。 它会在服务器启动时调用 yarn,也会在资产编译时调用。 您可以接受 Rails 存储库开发人员的选择,而不是费力地用 npm 替换 yarn。

只是提醒将来阅读此问题的任何人: Max Popoff 的答案仅在您首先定义其 Rakefile 中引用的新 rake 任务时才有效。 这篇博文中有更多信息,但基本上,您需要添加一个文件,如下所示:

# 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM