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