Project

General

Profile

Download (2.18 KB) Statistics
| Branch: | Tag: | Revision:
desc 'Compile plugin assets - called via rake plugin:assets:precompile[plugin_name]'
task 'plugin:assets:precompile', [:plugin] => [:environment] do |t, args|
# This task will generate assets for a plugin and namespace them in
# plugin_name/public/assets/<plugin_name>. The generated manifest.yaml found
# in the assets directory of the plugin is used to add the asset digest paths
# to the Rails digests list in production.rb.
module Foreman
class PluginAssetsTask < Sprockets::Rails::Task
attr_accessor :plugin

def initialize(plugin_id)
@plugin = Foreman::Plugin.find(plugin_id) or raise("Unable to find registered plugin #{plugin_id}")

Rails.env = 'production'
app = Rails.application
app.config.assets.digest = true
app.config.assets.precompile = plugin.assets

super(Rails.application)
end

def compile
with_logger do
manifest.compile(assets)
end
end

def output
File.join(plugin.path, 'public', 'assets')
end

def manifest_path
File.join(output, plugin.id.to_s, "#{plugin.id}.json")
end

def manifest
Sprockets::Manifest.new(index, output, manifest_path)
end
end
end

module Foreman
class PluginWebpackTask
attr_accessor :plugin

def initialize(plugin_id)
@plugin = Foreman::Plugin.find(plugin_id) or raise("Unable to find registered plugin #{plugin_id}")
end

def compile
return unless File.exist?("#{@plugin.path}/webpack")
return unless File.exist?("#{@plugin.path}/package.json")
ENV["NODE_ENV"] ||= 'production'
webpack_bin = ::Rails.root.join('node_modules/webpack/bin/webpack.js')
config_file = ::Rails.root.join(::Rails.configuration.webpack.config_file)
sh "#{webpack_bin} --config #{config_file} --bail --env.pluginName=#{@plugin.id}"
end
end
end

if args[:plugin]
task = Foreman::PluginAssetsTask.new(args[:plugin])
task.compile

task = Foreman::PluginWebpackTask.new(args[:plugin])
task.compile
else
puts "You must specify the name of the plugin (e.g. rake plugin:assets:precompile['my_plugin'])"
end
end
(27-27/41)