puck 1.0.0.pre0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/bin/puck +8 -0
- data/lib/puck.rb +8 -0
- data/lib/puck/bootstrap.rb +10 -0
- data/lib/puck/configuration.rb +44 -0
- data/lib/puck/jar.rb +117 -0
- data/lib/puck/version.rb +5 -0
- metadata +69 -0
data/bin/puck
ADDED
data/lib/puck.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'optparse'
|
4
|
+
|
5
|
+
|
6
|
+
module Puck
|
7
|
+
class Configuration
|
8
|
+
def initialize(defaults={})
|
9
|
+
@argv = defaults[:argv] || ARGV
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.get(defaults={})
|
13
|
+
new(defaults).get
|
14
|
+
end
|
15
|
+
|
16
|
+
def get
|
17
|
+
command_line_options
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def command_line_options
|
23
|
+
options = {}
|
24
|
+
|
25
|
+
state = nil
|
26
|
+
|
27
|
+
until @argv.empty?
|
28
|
+
arg = @argv.shift
|
29
|
+
case arg
|
30
|
+
when '--extra-files'
|
31
|
+
state = :extra_files
|
32
|
+
options[:extra_files] ||= []
|
33
|
+
else
|
34
|
+
case state
|
35
|
+
when :extra_files
|
36
|
+
options[:extra_files] << arg
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
options
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/lib/puck/jar.rb
ADDED
@@ -0,0 +1,117 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'fileutils'
|
4
|
+
require 'tmpdir'
|
5
|
+
require 'pathname'
|
6
|
+
require 'set'
|
7
|
+
require 'ant'
|
8
|
+
require 'bundler'
|
9
|
+
require 'jruby-jars'
|
10
|
+
require 'puck/version'
|
11
|
+
|
12
|
+
|
13
|
+
module Puck
|
14
|
+
class Jar
|
15
|
+
def initialize(configuration={})
|
16
|
+
@configuration = configuration.dup
|
17
|
+
@configuration[:base_dir] ||= Dir.pwd
|
18
|
+
@configuration[:project_name] ||= File.basename(@configuration[:base_dir])
|
19
|
+
@configuration[:build_dir] ||= File.join(@configuration[:base_dir], 'build')
|
20
|
+
@configuration[:jar_name] ||= @configuration[:project_name] + '.jar'
|
21
|
+
end
|
22
|
+
|
23
|
+
def create!
|
24
|
+
FileUtils.mkdir_p(@configuration[:build_dir])
|
25
|
+
|
26
|
+
Dir.mktmpdir do |tmp_dir|
|
27
|
+
output_path = File.join(@configuration[:build_dir], @configuration[:jar_name])
|
28
|
+
project_dir = Pathname.new(@configuration[:base_dir])
|
29
|
+
extra_files = @configuration[:extra_files] || []
|
30
|
+
gem_dependencies = resolve_gem_dependencies
|
31
|
+
create_jar_bootstrap!(tmp_dir, gem_dependencies)
|
32
|
+
|
33
|
+
ant = Ant.new(output_level: 1)
|
34
|
+
ant.jar(destfile: output_path) do
|
35
|
+
manifest do
|
36
|
+
attribute name: 'Main-Class', value: 'org.jruby.JarBootstrapMain'
|
37
|
+
attribute name: 'Created-By', value: "Puck v#{Puck::VERSION}"
|
38
|
+
end
|
39
|
+
|
40
|
+
zipfileset dir: tmp_dir, includes: 'jar-bootstrap.rb'
|
41
|
+
zipfileset src: JRubyJars.core_jar_path
|
42
|
+
zipfileset src: JRubyJars.stdlib_jar_path
|
43
|
+
|
44
|
+
%w[bin lib].each do |sub_dir|
|
45
|
+
zipfileset dir: project_dir + sub_dir, prefix: "META-INF/app.home/#{sub_dir}"
|
46
|
+
end
|
47
|
+
|
48
|
+
extra_files.each do |ef|
|
49
|
+
path = Pathname.new(ef).expand_path.cleanpath
|
50
|
+
prefix = 'META-INF/app.home/' + path.relative_path_from(project_dir).dirname.to_s
|
51
|
+
zipfileset dir: path.dirname, prefix: prefix, includes: path.basename
|
52
|
+
end
|
53
|
+
|
54
|
+
gem_dependencies.each do |spec|
|
55
|
+
zipfileset dir: spec[:base_path], prefix: spec[:jar_path]
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def resolve_gem_dependencies
|
62
|
+
gem_specs = Bundler::LockfileParser.new(File.read('Gemfile.lock')).specs.group_by(&:name)
|
63
|
+
definition = Bundler::Definition.build('Gemfile', 'Gemfile.lock', false)
|
64
|
+
dependencies = definition.dependencies.select { |d| d.groups.include?(:default) }.map(&:name)
|
65
|
+
specs = resolve_gem_specs(gem_specs, dependencies)
|
66
|
+
specs = specs.map do |bundler_spec|
|
67
|
+
case bundler_spec.source
|
68
|
+
when Bundler::Source::Git
|
69
|
+
revision = bundler_spec.source.options['revision']
|
70
|
+
gemspec_path = File.join(ENV['GEM_HOME'], 'bundler', 'gems', "#{bundler_spec.name}-#{revision[0, 12]}", "#{bundler_spec.name}.gemspec")
|
71
|
+
base_path = File.dirname(gemspec_path)
|
72
|
+
else
|
73
|
+
platform_ext = bundler_spec.platform == 'ruby' ? '' : "-#{bundler_spec.platform}"
|
74
|
+
gemspec_path = File.join(ENV['GEM_HOME'], 'specifications', "#{bundler_spec.full_name}#{platform_ext}.gemspec")
|
75
|
+
base_path = File.join(ENV['GEM_HOME'], 'gems', bundler_spec.full_name)
|
76
|
+
end
|
77
|
+
if File.exists?(gemspec_path)
|
78
|
+
gem_spec = Gem::Specification.load(gemspec_path)
|
79
|
+
load_paths = gem_spec.load_paths.map do |load_path|
|
80
|
+
index = load_path.index(gem_spec.full_name)
|
81
|
+
'META-INF/gem.home/' + load_path[index, load_path.length - index]
|
82
|
+
end
|
83
|
+
{
|
84
|
+
:name => gem_spec.name,
|
85
|
+
:versioned_name => gem_spec.full_name,
|
86
|
+
:base_path => base_path,
|
87
|
+
:jar_path => "META-INF/gem.home/#{gem_spec.full_name}",
|
88
|
+
:load_paths => load_paths
|
89
|
+
}
|
90
|
+
else
|
91
|
+
nil
|
92
|
+
end
|
93
|
+
end
|
94
|
+
specs.compact.uniq { |s| s[:versioned_name] }
|
95
|
+
end
|
96
|
+
|
97
|
+
def resolve_gem_specs(gem_specs, gem_names)
|
98
|
+
gem_names.flat_map do |name|
|
99
|
+
gem_specs[name].flat_map do |spec|
|
100
|
+
[spec, *resolve_gem_specs(gem_specs, spec.dependencies.map(&:name))]
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def create_jar_bootstrap!(tmp_dir, gem_dependencies)
|
106
|
+
File.open(File.join(tmp_dir, 'jar-bootstrap.rb'), 'w') do |io|
|
107
|
+
gem_dependencies.each do |spec|
|
108
|
+
spec[:load_paths].each do |load_path|
|
109
|
+
io.puts(%($LOAD_PATH << 'classpath:#{load_path}'))
|
110
|
+
end
|
111
|
+
end
|
112
|
+
io.puts
|
113
|
+
io.puts(File.read(File.expand_path('../bootstrap.rb', __FILE__)))
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
data/lib/puck/version.rb
ADDED
metadata
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: puck
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0.pre0
|
5
|
+
prerelease: 6
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Theo Hultberg
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-07-18 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: jruby-jars
|
16
|
+
version_requirements: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - '='
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: 1.7.3
|
21
|
+
none: false
|
22
|
+
requirement: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 1.7.3
|
27
|
+
none: false
|
28
|
+
prerelease: false
|
29
|
+
type: :runtime
|
30
|
+
description: Puck takes your app and packs it along with all your gems and a complete JRuby runtime in a standalone Jar file that can be run with just `java -jar …`
|
31
|
+
email:
|
32
|
+
- theo@iconara.net
|
33
|
+
executables: []
|
34
|
+
extensions: []
|
35
|
+
extra_rdoc_files: []
|
36
|
+
files:
|
37
|
+
- lib/puck.rb
|
38
|
+
- lib/puck/bootstrap.rb
|
39
|
+
- lib/puck/configuration.rb
|
40
|
+
- lib/puck/jar.rb
|
41
|
+
- lib/puck/version.rb
|
42
|
+
- bin/puck
|
43
|
+
homepage: http://github.com/iconara/puck
|
44
|
+
licenses: []
|
45
|
+
post_install_message:
|
46
|
+
rdoc_options: []
|
47
|
+
require_paths:
|
48
|
+
- lib
|
49
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: !binary |-
|
54
|
+
MA==
|
55
|
+
none: false
|
56
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - !binary |-
|
59
|
+
Pg==
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 1.3.1
|
62
|
+
none: false
|
63
|
+
requirements: []
|
64
|
+
rubyforge_project: puck
|
65
|
+
rubygems_version: 1.8.24
|
66
|
+
signing_key:
|
67
|
+
specification_version: 3
|
68
|
+
summary: Packs your JRuby app as a standalone Jar file
|
69
|
+
test_files: []
|