lib/appbundler/cli.rb in appbundler-0.7.0 vs lib/appbundler/cli.rb in appbundler-0.9.0

- old
+ new

@@ -5,14 +5,18 @@ module Appbundler class CLI include Mixlib::CLI banner(<<-BANNER) -Usage: appbundler APPLICATION_DIR BINSTUB_DIR +* appbundler #{VERSION} * - APPLICATION_DIR is the root directory to a working copy of your app +Usage: appbundler BUNDLE_DIR BINSTUB_DIR [GEM_NAME] [GEM_NAME] ... + + BUNDLE_DIR is the root directory to the bundle containing your app BINSTUB_DIR is the directory where you want generated executables to be written + GEM_NAME is the name of a gem you want to appbundle. Default is the directory name + of BUNDLE_DIR (e.g. /src/chef -> chef) Your bundled application must already be gem installed. Generated binstubs will point to the gem, not your working copy. BANNER @@ -40,12 +44,13 @@ cli.run end attr_reader :argv - attr_reader :app_path + attr_reader :bundle_path attr_reader :bin_path + attr_reader :gems def initialize(argv) @argv = argv super() end @@ -53,27 +58,30 @@ def handle_options parse_options(@argv) end def validate! - if cli_arguments.size != 2 + if cli_arguments.size < 2 usage_and_exit! else - @app_path = File.expand_path(cli_arguments[0]) + @bundle_path = File.expand_path(cli_arguments[0]) @bin_path = File.expand_path(cli_arguments[1]) - verify_app_path + @gems = cli_arguments[2..-1] + @gems = [ File.basename(@bundle_path) ] if @gems.empty? + verify_bundle_path verify_bin_path - verify_gem_installed + verify_gems_installed + verify_deps_are_accessible end end - def verify_app_path - if !File.directory?(app_path) - err("APPLICATION_DIR `#{app_path}' is not a directory or doesn't exist") + def verify_bundle_path + if !File.directory?(bundle_path) + err("BUNDLE_DIR `#{bundle_path}' is not a directory or doesn't exist") usage_and_exit! - elsif !File.exist?(File.join(app_path, "Gemfile.lock")) - err("APPLICATION_DIR does not contain required Gemfile.lock") + elsif !File.exist?(File.join(bundle_path, "Gemfile.lock")) + err("BUNDLE_DIR does not contain required Gemfile.lock") usage_and_exit! end end def verify_bin_path @@ -81,25 +89,43 @@ err("BINSTUB_DIR `#{bin_path}' is not a directory or doesn't exist") usage_and_exit! end end - def verify_gem_installed - app = App.new(app_path, bin_path) - app.app_gemspec - rescue Gem::LoadError - err("Unable to find #{app.app_spec.name} #{app.app_spec.version} installed as a gem") - err("You must install the top-level app as a gem before calling app-bundler") - usage_and_exit! + def verify_gems_installed + gems.each do |g| + begin + app = App.new(bundle_path, bin_path, g) + app.app_gemspec + rescue Gem::LoadError + err("Unable to find #{app.app_spec.name} #{app.app_spec.version} installed as a gem") + err("You must install the top-level app as a gem before calling app-bundler") + usage_and_exit! + end + end end + def verify_deps_are_accessible + gems.each do |g| + begin + app = App.new(bundle_path, bin_path, g) + app.verify_deps_are_accessible! + rescue InaccessibleGemsInLockfile => e + err(e.message) + exit 1 + end + end + end + def run - app = App.new(app_path, bin_path) - created_stubs = app.write_executable_stubs - created_stubs.each do |real_executable_path, stub_path| - $stdout.puts "Generated binstub #{stub_path} => #{real_executable_path}" + gems.each do |g| + app = App.new(bundle_path, bin_path, g) + created_stubs = app.write_executable_stubs + created_stubs.each do |real_executable_path, stub_path| + $stdout.puts "Generated binstub #{stub_path} => #{real_executable_path}" + end + app.copy_bundler_env end - app.copy_bundler_env end def err(message) $stderr.print("#{message}\n") end