Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bring back automatic yarn install run with deprecation notice #140

Merged
merged 3 commits into from
Jun 5, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,11 @@ Changes since last non-beta release.

_Please add entries here for your pull requests that are not yet released._

### Fixed
- Restores automatic installation of yarn packages removed in [#131](https://github.com/shakacode/shakapacker/pull/131), with added deprecation notice. [PR 140](https://github.com/shakacode/shakapacker/pull/140) by [tomdracz](https://github.com/tomdracz).

This will be again removed in Shakapacker v7 so you need to ensure you are installing yarn packages explicitly before the asset compilation, rather than relying on this behaviour through `asset:precompile` task (e.g. Capistrano deployment).

## [v6.4.0] - June 2, 2022
### Fixed
- Fixed [Issue 123: Rails 7.0.3 - Webpacker configuration file not found when running rails webpacker:install (shakapacker v6.3)](https://github.com/shakacode/shakapacker/issues/123) in [PR 136: Don't enhance precompile if no config #136](https://github.com/shakacode/shakapacker/pull/136) by [justin808](https://github.com/justin808).
Expand Down
12 changes: 10 additions & 2 deletions lib/tasks/webpacker/compile.rake
Original file line number Diff line number Diff line change
@@ -1,8 +1,16 @@
$stdout.sync = true

def yarn_install_available?
rails_major = Rails::VERSION::MAJOR
rails_minor = Rails::VERSION::MINOR

rails_major > 5 || (rails_major == 5 && rails_minor >= 1)
end

def enhance_assets_precompile
# yarn:install was added in Rails 5.1
Rake::Task["assets:precompile"].enhance do |task|
deps = yarn_install_available? ? [] : ["webpacker:yarn_install"]
Rake::Task["assets:precompile"].enhance(deps) do |task|
prefix = task.name.split(/#|assets:precompile/).first

Rake::Task["#{prefix}webpacker:compile"].invoke
Expand All @@ -29,6 +37,6 @@ if Webpacker.config.webpacker_precompile?
if Rake::Task.task_defined?("assets:precompile")
enhance_assets_precompile
else
Rake::Task.define_task("assets:precompile" => ["webpacker:compile"])
Rake::Task.define_task("assets:precompile" => ["webpacker:yarn_install", "webpacker:compile"])
end
end
24 changes: 24 additions & 0 deletions lib/tasks/webpacker/yarn_install.rake
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
namespace :webpacker do
desc "Support for older Rails versions. Install all JavaScript dependencies as specified via Yarn"
task :yarn_install do
warn <<~MSG.strip
Shakapacker - Automatic installation of yarn packages is deprecated
Automatic installation of yarn packages when assets are precompiled is deprecated and will be removed in Shakapacker v7.
Please ensure you are installing yarn packages explicitly before the asset compilation.
MSG

valid_node_envs = %w[test development production]
node_env = ENV.fetch("NODE_ENV") do
valid_node_envs.include?(Rails.env) ? Rails.env : "production"
end
Dir.chdir(Rails.root) do
yarn_flags =
if `yarn --version`.start_with?("1")
"--no-progress --frozen-lockfile"
else
"--immutable"
end
system({ "NODE_ENV" => node_env }, "yarn install #{yarn_flags}")
end
end
end
44 changes: 44 additions & 0 deletions lib/tasks/yarn.rake
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# frozen_string_literal: true
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why was this ever added @tomdracz


# Duplicate of the yarn tasks still present in Rails until Webpacker <5 have been deprecated

namespace :yarn do
desc "Install all JavaScript dependencies as specified via Yarn"
task :install do
begin
# Install only production deps when for not usual envs.
valid_node_envs = %w[test development production]
node_env = ENV.fetch("NODE_ENV") do
valid_node_envs.include?(Rails.env) ? Rails.env : "production"
end

yarn_flags =
if `#{RbConfig.ruby} "#{Rails.root}/bin/yarn" --version`.start_with?("1")
"--no-progress --frozen-lockfile"
else
"--immutable"
end

system(
{ "NODE_ENV" => node_env },
"#{RbConfig.ruby} \"#{Rails.root}/bin/yarn\" install #{yarn_flags}",
exception: true
)
rescue Errno::ENOENT
$stderr.puts "bin/yarn was not found."
$stderr.puts "Please run `bundle exec rails app:update:bin` to create it."
exit 1
end
end
end

# Run Yarn prior to Sprockets assets precompilation, so dependencies are available for use.
if Rake::Task.task_defined?("assets:precompile") && File.exist?(Rails.root.join("bin", "yarn"))
warn <<~MSG.strip
Shakapacker - Automatic installation of yarn packages is deprecated
Automatic installation of yarn packages when assets are precompiled is deprecated and will be removed in Shakapacker v7.
Please ensure you are installing yarn packages explicitly before the asset compilation.
MSG

Rake::Task["assets:precompile"].enhance [ "yarn:install" ]
end