diff options
author | Guillermo Iguaran <guilleiguaran@gmail.com> | 2016-11-29 10:04:47 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-11-29 10:04:47 -0500 |
commit | 43e42ad385f1048e6ec7a9df6c83daa5ef003870 (patch) | |
tree | ee63a13fccf9318a12ea6b513d103ba6abd26139 /railties/lib | |
parent | ffb81ad6e3326332556e8eab867fe1a27a989bf5 (diff) | |
parent | 9a95e13989380e59245d3d6fb0853953b806742c (diff) | |
download | rails-43e42ad385f1048e6ec7a9df6c83daa5ef003870.tar.gz rails-43e42ad385f1048e6ec7a9df6c83daa5ef003870.tar.bz2 rails-43e42ad385f1048e6ec7a9df6c83daa5ef003870.zip |
Merge pull request #26836 from Liceth/npm
Add Yarn support in new apps using --yarn option
Diffstat (limited to 'railties/lib')
7 files changed, 82 insertions, 3 deletions
diff --git a/railties/lib/rails/generators/app_base.rb b/railties/lib/rails/generators/app_base.rb index 2778c93429..99fc5d9525 100644 --- a/railties/lib/rails/generators/app_base.rb +++ b/railties/lib/rails/generators/app_base.rb @@ -33,6 +33,9 @@ module Rails class_option :javascript, type: :string, aliases: "-j", desc: "Preconfigure for selected JavaScript library" + class_option :yarn, type: :boolean, default: false, + desc: "Preconfigure for assets management with Yarn" + class_option :skip_gemfile, type: :boolean, default: false, desc: "Don't create a Gemfile" @@ -411,6 +414,55 @@ module Rails bundle_command("install") if bundle_install? end + def run_yarn + if package_json_exist? + if yarn_path + say_status :run, "yarn install" + yarn_command("install") + else + say_status :warning, "yarn option passed but Yarn executable was not detected in the system.", :yellow + say_status :warning, "Download Yarn at https://yarnpkg.com/en/docs/install", :yellow + end + end + end + + def package_json_exist? + File.exist?("package.json") + end + + def yarn_path + commands = ["yarn"] + + if RbConfig::CONFIG["host_os"] =~ /mswin|cygwin/ + ENV["PATHEXT"].split(File::PATH_SEPARATOR).each do |ext| + commands << commands[0] + ext + end + end + + yarn_path = commands.find do |cmd| + paths = ENV["PATH"].split(File::PATH_SEPARATOR) + + path = paths.find do |p| + full_path = File.expand_path(cmd, p) + File.executable?(full_path) && File.file?(full_path) + end + + path && File.expand_path(cmd, path) + end + + yarn_path + end + + def yarn_command(command) + full_command = "#{yarn_path} #{command}" + + if options[:quiet] + system(full_command, out: File::NULL) + else + system(full_command) + end + end + def generate_spring_binstubs if bundle_install? && spring_install? bundle_command("exec spring binstub --all") diff --git a/railties/lib/rails/generators/rails/app/app_generator.rb b/railties/lib/rails/generators/rails/app/app_generator.rb index d6ffa2d89d..03fd298fbc 100644 --- a/railties/lib/rails/generators/rails/app/app_generator.rb +++ b/railties/lib/rails/generators/rails/app/app_generator.rb @@ -53,6 +53,10 @@ module Rails template "gitignore", ".gitignore" end + def packagejson + template "package.json" + end + def app directory "app" @@ -205,6 +209,7 @@ module Rails build(:readme) build(:rakefile) build(:configru) + build(:packagejson) if options[:yarn] build(:gitignore) unless options[:skip_git] build(:gemfile) unless options[:skip_gemfile] end @@ -355,7 +360,7 @@ module Rails end public_task :apply_rails_template, :run_bundle - public_task :generate_spring_binstubs + public_task :run_yarn, :generate_spring_binstubs def run_after_bundle_callbacks @after_bundle_callbacks.each(&:call) diff --git a/railties/lib/rails/generators/rails/app/templates/bin/setup.tt b/railties/lib/rails/generators/rails/app/templates/bin/setup.tt index 8635e97b76..c82a922eef 100644 --- a/railties/lib/rails/generators/rails/app/templates/bin/setup.tt +++ b/railties/lib/rails/generators/rails/app/templates/bin/setup.tt @@ -16,8 +16,11 @@ chdir APP_ROOT do puts '== Installing dependencies ==' system! 'gem install bundler --conservative' system('bundle check') || system!('bundle install') -<% unless options.skip_active_record -%> +<% if options[:yarn] %> + system! 'yarn' +<% end %> +<% unless options.skip_active_record -%> # puts "\n== Copying sample files ==" # unless File.exist?('config/database.yml') # cp 'config/database.yml.sample', 'config/database.yml' diff --git a/railties/lib/rails/generators/rails/app/templates/bin/update.tt b/railties/lib/rails/generators/rails/app/templates/bin/update.tt index d385b363c6..0d8ca2f902 100644 --- a/railties/lib/rails/generators/rails/app/templates/bin/update.tt +++ b/railties/lib/rails/generators/rails/app/templates/bin/update.tt @@ -16,8 +16,11 @@ chdir APP_ROOT do puts '== Installing dependencies ==' system! 'gem install bundler --conservative' system('bundle check') || system!('bundle install') -<% unless options.skip_active_record -%> +<% if options[:yarn] %> + system! 'yarn' +<% end %> +<% unless options.skip_active_record -%> puts "\n== Updating database ==" system! 'bin/rails db:migrate' <% end -%> diff --git a/railties/lib/rails/generators/rails/app/templates/config/initializers/assets.rb.tt b/railties/lib/rails/generators/rails/app/templates/config/initializers/assets.rb.tt index 2318cf59ff..1ba182e562 100644 --- a/railties/lib/rails/generators/rails/app/templates/config/initializers/assets.rb.tt +++ b/railties/lib/rails/generators/rails/app/templates/config/initializers/assets.rb.tt @@ -5,6 +5,10 @@ Rails.application.config.assets.version = '1.0' # Add additional assets to the asset load path # Rails.application.config.assets.paths << Emoji.images_path +<%- if options[:yarn] -%> +# Add Yarn node_modules folder to the asset load path. +Rails.application.config.assets.paths << Rails.root.join('node_modules') +<%- end -%> # Precompile additional assets. # application.js, application.css, and all non-JS/CSS in the app/assets diff --git a/railties/lib/rails/generators/rails/app/templates/gitignore b/railties/lib/rails/generators/rails/app/templates/gitignore index 0e66cc4237..bdcbe8d629 100644 --- a/railties/lib/rails/generators/rails/app/templates/gitignore +++ b/railties/lib/rails/generators/rails/app/templates/gitignore @@ -21,5 +21,10 @@ !/tmp/.keep <% end -%> +<% if options[:yarn] -%> +# Ignore node modules. +/node_modules/* + +<% end -%> # Ignore Byebug command history file. .byebug_history diff --git a/railties/lib/rails/generators/rails/app/templates/package.json b/railties/lib/rails/generators/rails/app/templates/package.json new file mode 100644 index 0000000000..78f4a2e6b0 --- /dev/null +++ b/railties/lib/rails/generators/rails/app/templates/package.json @@ -0,0 +1,7 @@ +{ + "name": "<%= app_name %>", + "private": true, + "dependencies": { + "rails-ujs": "rails/rails-ujs" + } +} |