packager 0.0.3 → 0.0.4
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/README.md +35 -0
- data/lib/packager.rb +1 -1
- data/lib/packager/rake/base_task.rb +164 -0
- data/lib/packager/rake/mac_task.rb +129 -0
- data/lib/packager/rake/windows_task.rb +119 -0
- data/lib/packager/rake_task.rb +14 -265
- data/lib/packager/version.rb +1 -1
- data/{lib/packager/build → resources}/Distribution.erb +0 -0
- data/{lib/packager/build → resources}/PackageInfo.erb +0 -0
- data/resources/packager.iss.erb +46 -0
- metadata +10 -5
data/README.md
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# Packager
|
2
|
+
|
3
|
+
Packager is a Ruby Gem that builds one-click installer packages
|
4
|
+
of your gem for Mac OS X and Windows.
|
5
|
+
|
6
|
+
## Requirements
|
7
|
+
|
8
|
+
**Windows:** MinGW Ruby install (such as [One-Click RubyInstaller](http://rubyinstaller.org/)) and [Inno Setup](http://www.jrsoftware.org/isdl.php)
|
9
|
+
|
10
|
+
**Mac OS X:** Universal binary version of Ruby ([Learn More](https://github.com/wagenet/packager/wiki/Ruby-Universal-Binary-Installation)) and possibly the OS X Developer Tools
|
11
|
+
|
12
|
+
## Usage
|
13
|
+
|
14
|
+
In your project's Rakefile
|
15
|
+
|
16
|
+
Packager::RakeTask.new(:pkg) do |t|
|
17
|
+
t.package_name = "My Project"
|
18
|
+
t.version = "1.0.0"
|
19
|
+
t.domain = "myproject.com"
|
20
|
+
t.bin_files = ["utility", "helper"]
|
21
|
+
t.resource_files = ["images", "README"]
|
22
|
+
end
|
23
|
+
|
24
|
+
## Known Issues
|
25
|
+
|
26
|
+
* Requires a git repo for your project (git ls-files is used internally)
|
27
|
+
* Limited configuration
|
28
|
+
* No installer styling options
|
29
|
+
* When uninstalling from Windows Ruby Uninstaller isn't run properly,
|
30
|
+
though this shouldn't actually cause any problems.
|
31
|
+
|
32
|
+
## Credits
|
33
|
+
|
34
|
+
* Peter Wagenet
|
35
|
+
* Yehuda Katz
|
data/lib/packager.rb
CHANGED
@@ -0,0 +1,164 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/tasklib'
|
3
|
+
require 'erb'
|
4
|
+
require 'rbconfig'
|
5
|
+
require 'packager'
|
6
|
+
|
7
|
+
module Packager
|
8
|
+
module Rake
|
9
|
+
class BaseTask < ::Rake::TaskLib
|
10
|
+
|
11
|
+
attr_accessor :version
|
12
|
+
|
13
|
+
attr_accessor :package_name
|
14
|
+
|
15
|
+
attr_accessor :short_package_name
|
16
|
+
|
17
|
+
attr_accessor :domain
|
18
|
+
|
19
|
+
attr_accessor :bin_files
|
20
|
+
|
21
|
+
attr_accessor :resource_files
|
22
|
+
|
23
|
+
def initialize
|
24
|
+
@domain = 'gemcutter.org'
|
25
|
+
@bin_files = []
|
26
|
+
@resource_files = []
|
27
|
+
@package_name, @short_package_name = nil
|
28
|
+
|
29
|
+
yield self if block_given?
|
30
|
+
|
31
|
+
if !@package_name || @package_name.empty?
|
32
|
+
raise "package_name is required"
|
33
|
+
end
|
34
|
+
|
35
|
+
@short_package_name ||= package_name.downcase.gsub(/\W+/,'-')
|
36
|
+
end
|
37
|
+
|
38
|
+
def ruby_bin_path
|
39
|
+
nil
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def setup_bundler
|
45
|
+
require 'bundler/shared_helpers'
|
46
|
+
|
47
|
+
unless Bundler::SharedHelpers.in_bundle?
|
48
|
+
raise "Must be in a Bundler bundle"
|
49
|
+
end
|
50
|
+
|
51
|
+
require 'bundler'
|
52
|
+
|
53
|
+
begin
|
54
|
+
Bundler.setup
|
55
|
+
rescue Bundler::GemNotFound
|
56
|
+
# Do nothing yet, since we don't actually care
|
57
|
+
end
|
58
|
+
|
59
|
+
# Add bundler to the load path after disabling system gems
|
60
|
+
bundler_lib = File.expand_path("../..", __FILE__)
|
61
|
+
$LOAD_PATH.unshift(bundler_lib) unless $LOAD_PATH.include?(bundler_lib)
|
62
|
+
end
|
63
|
+
|
64
|
+
def create_bundle_file_task(&block)
|
65
|
+
file "#{package_name}/local/#{short_package_name}/bundle" => "Gemfile" do
|
66
|
+
block.call if block
|
67
|
+
|
68
|
+
setup_bundler
|
69
|
+
|
70
|
+
unless RUBY_VERSION == "1.9.2"
|
71
|
+
puts "Please use Ruby 1.9.2"
|
72
|
+
exit 1
|
73
|
+
end
|
74
|
+
|
75
|
+
puts "Regenerating the bundle."
|
76
|
+
|
77
|
+
rm_rf "bundle"
|
78
|
+
rm_rf ".bundle"
|
79
|
+
rm_rf "#{short_package_name}-pkg"
|
80
|
+
rm "#{package_name}.pkg", :force => true
|
81
|
+
Bundler.with_clean_env do
|
82
|
+
sh "bundle --standalone --without development"
|
83
|
+
end
|
84
|
+
mkdir_p "#{package_name}/local/#{short_package_name}"
|
85
|
+
cp_r "bundle", "#{package_name}/local/#{short_package_name}/"
|
86
|
+
|
87
|
+
verbose(false) do
|
88
|
+
Dir.chdir("#{package_name}/local/#{short_package_name}/bundle/ruby/1.9.1") do
|
89
|
+
Dir["{bin,cache,doc,specifications}"].each { |f| rm_rf f }
|
90
|
+
Dir["**/{ext,docs,test,spec}"].each { |f| rm_rf(f) if File.directory?(f) && f !~ /maruku/i }
|
91
|
+
Dir["**/erubis-*/doc-api"].each {|f| rm_rf(f) }
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def create_lib_file_task
|
98
|
+
file "#{package_name}/local/#{short_package_name}/lib"
|
99
|
+
|
100
|
+
`git ls-files -- lib`.split("\n").each do |file|
|
101
|
+
# submodules show up as a single file
|
102
|
+
files = File.directory?(file) ? Dir["#{file}/**/*"] : [file]
|
103
|
+
|
104
|
+
files.each do |f|
|
105
|
+
dest = "#{package_name}/local/#{short_package_name}/#{f}"
|
106
|
+
file dest => f do
|
107
|
+
verbose(false) { mkdir_p File.dirname(dest) }
|
108
|
+
cp_r f, dest
|
109
|
+
end
|
110
|
+
task "#{package_name}/local/#{short_package_name}/lib" => dest
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def create_bin_files_task
|
116
|
+
bin_files.each do |bin_name|
|
117
|
+
path = "#{package_name}/bin/#{bin_name}"
|
118
|
+
file path => "bin/#{bin_name}" do
|
119
|
+
data = File.read("bin/#{bin_name}").sub(/\A#.*/, "#!#{ruby_bin_path}") if ruby_bin_path
|
120
|
+
|
121
|
+
mkdir_p "#{package_name}/bin"
|
122
|
+
File.open(path, "w") { |file| file.puts data }
|
123
|
+
File.chmod 0755, path
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def create_resource_files_task
|
129
|
+
resource_files.each do |resource_name|
|
130
|
+
file "#{package_name}/local/#{short_package_name}/#{resource_name}" => resource_name do
|
131
|
+
destdir = "#{package_name}/local/#{short_package_name}/#{File.dirname(resource_name)}"
|
132
|
+
mkdir_p destdir
|
133
|
+
cp_r resource_name, destdir
|
134
|
+
target = "#{package_name}/local/#{short_package_name}/#{resource_name}"
|
135
|
+
if File.directory?(target)
|
136
|
+
Dir.glob(target).each{|f| File.chmod 0655 unless File.directory?(f) }
|
137
|
+
else
|
138
|
+
File.chmod 0644, target
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
def make_pkg_tasks
|
145
|
+
tasks = ["#{package_name}/local/#{short_package_name}/bundle",
|
146
|
+
"#{package_name}/local/#{short_package_name}/lib"]
|
147
|
+
tasks += bin_files.map{|b| "#{package_name}/bin/#{b}" }
|
148
|
+
tasks += resource_files.map{|r| "#{package_name}/local/#{short_package_name}/#{r}" }
|
149
|
+
end
|
150
|
+
|
151
|
+
def create_make_pkg_task
|
152
|
+
task :make_pkg => make_pkg_tasks
|
153
|
+
end
|
154
|
+
|
155
|
+
def create_rm_task
|
156
|
+
# TODO: Remove more fully
|
157
|
+
task :rm do
|
158
|
+
rm_rf package_name
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
require 'packager/rake/base_task'
|
2
|
+
|
3
|
+
module Packager
|
4
|
+
module Rake
|
5
|
+
class MacTask < BaseTask
|
6
|
+
|
7
|
+
def initialize(*)
|
8
|
+
super
|
9
|
+
|
10
|
+
create_bundle_file_task do
|
11
|
+
unless RbConfig::CONFIG["target_cpu"] == "universal"
|
12
|
+
puts "Please use a universal binary copy of ruby"
|
13
|
+
exit 1
|
14
|
+
end
|
15
|
+
end
|
16
|
+
create_lib_file_task
|
17
|
+
create_bin_files_task
|
18
|
+
create_resource_files_task
|
19
|
+
create_make_pkg_task
|
20
|
+
create_rm_task
|
21
|
+
create_directory_tasks
|
22
|
+
create_distribution_file_task
|
23
|
+
create_package_info_file_task
|
24
|
+
create_bom_file_task
|
25
|
+
create_payload_file_task
|
26
|
+
create_pkg_task
|
27
|
+
|
28
|
+
desc "Package for Mac OS X"
|
29
|
+
task :pkg => "#{package_name}.pkg"
|
30
|
+
|
31
|
+
desc "Clean and Package for Mac OS X"
|
32
|
+
task :clean => [:rm, :pkg]
|
33
|
+
end
|
34
|
+
|
35
|
+
def reverse_domain
|
36
|
+
@reverse_domain ||= domain.split(".").reverse.join(".")
|
37
|
+
end
|
38
|
+
|
39
|
+
def total_size
|
40
|
+
get_details unless @total_size
|
41
|
+
@total_size
|
42
|
+
end
|
43
|
+
|
44
|
+
def num_files
|
45
|
+
get_details unless @num_files
|
46
|
+
@num_files
|
47
|
+
end
|
48
|
+
|
49
|
+
def kbytes
|
50
|
+
total_size / 1024
|
51
|
+
end
|
52
|
+
|
53
|
+
def ruby_bin_path
|
54
|
+
"/usr/local/ruby1.9/bin/ruby -I /usr/local/#{short_package_name}/bundle -r bundler/setup"
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
# HELPERS
|
60
|
+
|
61
|
+
def get_details
|
62
|
+
@total_size, @num_files = 0, 0
|
63
|
+
|
64
|
+
Dir["#{package_name}/**/*"].each do |file|
|
65
|
+
@num_files += 1
|
66
|
+
|
67
|
+
next if File.directory?(file)
|
68
|
+
|
69
|
+
@total_size += File.size(file)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
# TASK DEFINITIONS
|
74
|
+
|
75
|
+
def create_directory_tasks
|
76
|
+
directory "#{short_package_name}-pkg/Resources"
|
77
|
+
directory "#{short_package_name}-pkg/#{short_package_name}.pkg"
|
78
|
+
end
|
79
|
+
|
80
|
+
def create_distribution_file_task
|
81
|
+
erb_path = File.join(RESOURCES_PATH, "Distribution.erb")
|
82
|
+
|
83
|
+
file "#{short_package_name}-pkg/Distribution" do
|
84
|
+
src = File.read erb_path
|
85
|
+
erb = ERB.new(src)
|
86
|
+
|
87
|
+
File.open("#{short_package_name}-pkg/Distribution", "w") do |file|
|
88
|
+
file.puts erb.result(binding)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def create_package_info_file_task
|
94
|
+
erb_path = File.join(RESOURCES_PATH, "PackageInfo.erb")
|
95
|
+
|
96
|
+
file "#{short_package_name}-pkg/#{short_package_name}.pkg/PackageInfo" do
|
97
|
+
src = File.read erb_path
|
98
|
+
erb = ERB.new(src)
|
99
|
+
|
100
|
+
File.open("#{short_package_name}-pkg/#{short_package_name}.pkg/PackageInfo", "w") do |file|
|
101
|
+
file.puts erb.result(binding)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def create_bom_file_task
|
107
|
+
file "#{short_package_name}-pkg/#{short_package_name}.pkg/Bom" do
|
108
|
+
sh "mkbom -s #{package_name} #{short_package_name}-pkg/#{short_package_name}.pkg/Bom"
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def create_payload_file_task
|
113
|
+
file "#{short_package_name}-pkg/#{short_package_name}.pkg/Payload" do
|
114
|
+
sh "cd #{package_name} && pax -wz -x cpio . > ../#{short_package_name}-pkg/#{short_package_name}.pkg/Payload"
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
def create_pkg_task
|
119
|
+
pkg_dependencies = [:make_pkg, "#{short_package_name}-pkg/Resources", "#{short_package_name}-pkg/#{short_package_name}.pkg",
|
120
|
+
"#{short_package_name}-pkg/Distribution", "#{short_package_name}-pkg/#{short_package_name}.pkg/Bom",
|
121
|
+
"#{short_package_name}-pkg/#{short_package_name}.pkg/PackageInfo", "#{short_package_name}-pkg/#{short_package_name}.pkg/Payload"]
|
122
|
+
|
123
|
+
file "#{package_name}.pkg" => pkg_dependencies do
|
124
|
+
sh "pkgutil --flatten #{short_package_name}-pkg #{package_name}.pkg"
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
@@ -0,0 +1,119 @@
|
|
1
|
+
require 'packager/rake/base_task'
|
2
|
+
|
3
|
+
module Packager
|
4
|
+
module Rake
|
5
|
+
class WindowsTask < BaseTask
|
6
|
+
|
7
|
+
attr_accessor :path_constant
|
8
|
+
|
9
|
+
def initialize(*)
|
10
|
+
super
|
11
|
+
|
12
|
+
@path_constant ||= "#{package_name.gsub(/\s+/,'')}Path"
|
13
|
+
|
14
|
+
create_bundle_file_task do
|
15
|
+
unless RbConfig::CONFIG["host_os"] =~ /mingw32/
|
16
|
+
puts "Please use a mingw32 copy of ruby"
|
17
|
+
exit 1
|
18
|
+
end
|
19
|
+
end
|
20
|
+
create_lib_file_task
|
21
|
+
create_bin_files_task
|
22
|
+
create_bin_file_aliases_task
|
23
|
+
create_resource_files_task
|
24
|
+
create_make_pkg_task
|
25
|
+
create_rm_task
|
26
|
+
|
27
|
+
create_ruby_download_task
|
28
|
+
create_iss_task
|
29
|
+
create_pkg_task
|
30
|
+
|
31
|
+
desc "Package for Windows"
|
32
|
+
task :pkg => "#{package_name}.exe"
|
33
|
+
|
34
|
+
desc "Clean and Package for Windows"
|
35
|
+
task :clean => [:rm, :pkg]
|
36
|
+
end
|
37
|
+
|
38
|
+
def ruby_bin_path
|
39
|
+
"\"%#{path_constant}%/ruby/bin/ruby.exe\" -I \"%#{path_constant}%/local/#{short_package_name}/bundle\" -r bundler/setup"
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def create_bin_file_aliases_task
|
45
|
+
bin_files.each do |bin_name|
|
46
|
+
path = "#{package_name}/bin/#{bin_name}.bat"
|
47
|
+
file path => "bin/#{bin_name}" do
|
48
|
+
File.open(path, "w") do |f|
|
49
|
+
f.puts <<END
|
50
|
+
@ECHO OFF
|
51
|
+
IF NOT "%~f0" == "~f0" GOTO :WinNT
|
52
|
+
@#{ruby_bin_path} "#{bin_name}" %1 %2 %3 %4 %5 %6 %7 %8 %9
|
53
|
+
GOTO :EOF
|
54
|
+
:WinNT
|
55
|
+
@#{ruby_bin_path} "%~dpn0" %*
|
56
|
+
END
|
57
|
+
end
|
58
|
+
File.chmod 0755, path
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def create_ruby_download_task
|
64
|
+
installer_path = "#{package_name}/rubyinstaller.exe"
|
65
|
+
|
66
|
+
task :download_ruby do
|
67
|
+
unless File.exist?(installer_path)
|
68
|
+
mkdir_p File.dirname(installer_path)
|
69
|
+
|
70
|
+
puts "Downloading rubyinstaller.exe"
|
71
|
+
|
72
|
+
require 'net/http'
|
73
|
+
Net::HTTP.start("packager.strobeapp.com") do |http|
|
74
|
+
File.open(installer_path, 'wb') do |f|
|
75
|
+
http.request_get('/rubyinstaller.exe') do |resp|
|
76
|
+
resp.read_body do |segment|
|
77
|
+
print '.'
|
78
|
+
f.write(segment)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
puts "Done"
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def create_iss_task
|
90
|
+
erb_path = File.join(RESOURCES_PATH, "packager.iss.erb")
|
91
|
+
|
92
|
+
file "#{package_name}/packager.iss" do
|
93
|
+
src = File.read erb_path
|
94
|
+
erb = ERB.new(src)
|
95
|
+
|
96
|
+
File.open("#{package_name}/packager.iss", "w") do |file|
|
97
|
+
file.puts erb.result(binding)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def make_pkg_tasks
|
103
|
+
super + bin_files.map{|b| "#{package_name}/bin/#{b}.bat" }
|
104
|
+
end
|
105
|
+
|
106
|
+
def create_pkg_task
|
107
|
+
file "#{package_name}.exe" => [:make_pkg, :download_ruby, "#{package_name}/packager.iss"] do
|
108
|
+
inno_dir = ENV['INNO_DIR'] || "C:\\Program Files\\Inno Setup 5\\"
|
109
|
+
inno_dir += '\\' unless inno_dir[-1..-1] == '\\'
|
110
|
+
|
111
|
+
puts "Compiling. This may take a while..."
|
112
|
+
sh %{"#{inno_dir}Compil32.exe" /cc "#{package_name}\\packager.iss"}
|
113
|
+
mv "#{package_name}/Output/setup.exe", "#{package_name}.exe"
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
data/lib/packager/rake_task.rb
CHANGED
@@ -1,279 +1,28 @@
|
|
1
|
+
require 'rbconfig'
|
1
2
|
require 'rake'
|
2
3
|
require 'rake/tasklib'
|
3
|
-
require 'erb'
|
4
4
|
|
5
5
|
module Packager
|
6
6
|
class RakeTask < ::Rake::TaskLib
|
7
7
|
|
8
|
-
|
9
|
-
#
|
10
|
-
# default:
|
11
|
-
# :pkg
|
12
|
-
attr_accessor :name
|
13
|
-
|
14
|
-
# Namespace for tasks.
|
15
|
-
#
|
16
|
-
# default:
|
17
|
-
# :packager
|
18
|
-
attr_accessor :group
|
19
|
-
|
20
|
-
attr_accessor :version
|
21
|
-
|
22
|
-
attr_accessor :package_name
|
23
|
-
|
24
|
-
attr_accessor :short_package_name
|
25
|
-
|
26
|
-
attr_accessor :domain
|
27
|
-
|
28
|
-
attr_accessor :bin_files
|
29
|
-
|
30
|
-
attr_accessor :resource_files
|
31
|
-
|
32
|
-
def initialize(name=:pkg)
|
33
|
-
@name = name
|
34
|
-
@group = :packager
|
35
|
-
@domain = 'gemcutter.org'
|
36
|
-
@bin_files = []
|
37
|
-
@resource_files = []
|
38
|
-
@package_name, @short_package_name = nil
|
39
|
-
|
40
|
-
yield self if block_given?
|
41
|
-
|
42
|
-
if !@package_name || @package_name.empty?
|
43
|
-
raise "package_name is required"
|
44
|
-
end
|
45
|
-
|
46
|
-
@short_package_name ||= package_name.downcase.gsub(/\W+/,'-')
|
47
|
-
|
8
|
+
def initialize(name=:pkg, group=:packager, &block)
|
48
9
|
namespace group do
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
payload_file_task
|
60
|
-
pkg_task
|
61
|
-
|
62
|
-
desc "Package for Mac OS X"
|
63
|
-
task :pkg => "#{package_name}.pkg"
|
64
|
-
|
65
|
-
desc "Clean and Package for Mac OS X"
|
66
|
-
task :clean => [:rm, :pkg]
|
67
|
-
end
|
68
|
-
|
69
|
-
desc "Package for Mac OS X"
|
70
|
-
task name => "#{group}:pkg"
|
71
|
-
end
|
72
|
-
|
73
|
-
def reverse_domain
|
74
|
-
@reverse_domain ||= domain.split(".").reverse.join(".")
|
75
|
-
end
|
76
|
-
|
77
|
-
def total_size
|
78
|
-
get_details unless @total_size
|
79
|
-
@total_size
|
80
|
-
end
|
81
|
-
|
82
|
-
def num_files
|
83
|
-
get_details unless @num_files
|
84
|
-
@num_files
|
85
|
-
end
|
86
|
-
|
87
|
-
def kbytes
|
88
|
-
total_size / 1024
|
89
|
-
end
|
90
|
-
|
91
|
-
private
|
92
|
-
|
93
|
-
# HELPERS
|
94
|
-
|
95
|
-
def pkg_dependencies
|
96
|
-
[:make_pkg, "#{short_package_name}-pkg/Resources", "#{short_package_name}-pkg/#{short_package_name}.pkg",
|
97
|
-
"#{short_package_name}-pkg/Distribution", "#{short_package_name}-pkg/#{short_package_name}.pkg/Bom",
|
98
|
-
"#{short_package_name}-pkg/#{short_package_name}.pkg/PackageInfo", "#{short_package_name}-pkg/#{short_package_name}.pkg/Payload"]
|
99
|
-
end
|
100
|
-
|
101
|
-
def get_details
|
102
|
-
@total_size, @num_files = 0, 0
|
103
|
-
|
104
|
-
Dir["#{package_name}/**/*"].each do |file|
|
105
|
-
@num_files += 1
|
106
|
-
|
107
|
-
next if File.directory?(file)
|
108
|
-
|
109
|
-
@total_size += File.size(file)
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
def setup_bundler
|
114
|
-
require 'bundler/shared_helpers'
|
115
|
-
|
116
|
-
unless Bundler::SharedHelpers.in_bundle?
|
117
|
-
raise "Must be in a Bundler bundle"
|
118
|
-
end
|
119
|
-
|
120
|
-
require 'bundler'
|
121
|
-
|
122
|
-
begin
|
123
|
-
Bundler.setup
|
124
|
-
rescue Bundler::GemNotFound
|
125
|
-
# Do nothing yet, since we don't actually care
|
126
|
-
end
|
127
|
-
|
128
|
-
# Add bundler to the load path after disabling system gems
|
129
|
-
bundler_lib = File.expand_path("../..", __FILE__)
|
130
|
-
$LOAD_PATH.unshift(bundler_lib) unless $LOAD_PATH.include?(bundler_lib)
|
131
|
-
end
|
132
|
-
|
133
|
-
# TASK DEFINITIONS
|
134
|
-
|
135
|
-
def bundle_file_task
|
136
|
-
file "#{package_name}/local/#{short_package_name}/bundle" => "Gemfile" do
|
137
|
-
require "rbconfig"
|
138
|
-
|
139
|
-
setup_bundler
|
140
|
-
|
141
|
-
unless Config::CONFIG["target_cpu"] == "universal"
|
142
|
-
puts "Please use a universal binary copy of ruby"
|
143
|
-
exit 1
|
144
|
-
end
|
145
|
-
|
146
|
-
unless RUBY_VERSION == "1.9.2"
|
147
|
-
puts "Please use Ruby 1.9.2"
|
148
|
-
exit 1
|
149
|
-
end
|
150
|
-
|
151
|
-
puts "Regenerating the bundle."
|
152
|
-
|
153
|
-
sh "rm -rf bundle"
|
154
|
-
sh "rm -rf .bundle"
|
155
|
-
sh "rm -rf #{short_package_name}-pkg"
|
156
|
-
sh "rm -f #{package_name}.pkg"
|
157
|
-
Bundler.with_clean_env do
|
158
|
-
sh "bundle --standalone --without development"
|
159
|
-
end
|
160
|
-
sh "mkdir -p #{package_name}/local/#{short_package_name}"
|
161
|
-
sh "cp -R bundle #{package_name}/local/#{short_package_name}/"
|
162
|
-
|
163
|
-
verbose(false) do
|
164
|
-
Dir.chdir("#{package_name}/local/#{short_package_name}/bundle/ruby/1.9.1") do
|
165
|
-
Dir["{bin,cache,doc,specifications}"].each { |f| rm_rf f }
|
166
|
-
Dir["**/{ext,docs,test,spec}"].each { |f| rm_rf(f) if File.directory?(f) && f !~ /maruku/i }
|
167
|
-
Dir["**/erubis-*/doc-api"].each {|f| rm_rf(f) }
|
168
|
-
end
|
169
|
-
end
|
170
|
-
end
|
171
|
-
end
|
172
|
-
|
173
|
-
def lib_file_task
|
174
|
-
file "#{package_name}/local/#{short_package_name}/lib"
|
175
|
-
|
176
|
-
`git ls-files -- lib`.split("\n").each do |file|
|
177
|
-
dest = "#{package_name}/local/#{short_package_name}/#{file}"
|
178
|
-
file dest => file do
|
179
|
-
verbose(false) { mkdir_p File.dirname(dest) }
|
180
|
-
cp_r file, dest
|
181
|
-
end
|
182
|
-
task "#{package_name}/local/#{short_package_name}/lib" => dest
|
183
|
-
end
|
184
|
-
end
|
185
|
-
|
186
|
-
def bin_files_task
|
187
|
-
bin_files.each do |bin_name|
|
188
|
-
file "#{package_name}/bin/#{bin_name}" => "bin/#{bin_name}" do
|
189
|
-
data = File.read("bin/#{bin_name}").sub(/\A#.*/, "#!/usr/local/ruby1.9/bin/ruby -I /usr/local/#{short_package_name}/bundle -r bundler/setup")
|
190
|
-
|
191
|
-
sh "mkdir -p #{package_name}/bin"
|
192
|
-
File.open("#{package_name}/bin/#{bin_name}", "w") { |file| file.puts data }
|
193
|
-
File.chmod 0755, "#{package_name}/bin/#{bin_name}"
|
194
|
-
end
|
195
|
-
end
|
196
|
-
end
|
197
|
-
|
198
|
-
def resource_files_task
|
199
|
-
resource_files.each do |resource_name|
|
200
|
-
file "#{package_name}/local/#{short_package_name}/#{resource_name}" => resource_name do
|
201
|
-
destdir = "#{package_name}/local/#{short_package_name}/#{File.dirname(resource_name)}"
|
202
|
-
sh "mkdir -p #{destdir}"
|
203
|
-
sh "cp -R #{resource_name} #{destdir}"
|
204
|
-
target = "#{package_name}/local/#{short_package_name}/#{resource_name}"
|
205
|
-
if File.directory?(target)
|
206
|
-
Dir.glob(target).each{|f| File.chmod 0655 unless File.directory?(f) }
|
207
|
-
else
|
208
|
-
File.chmod 0644, target
|
209
|
-
end
|
210
|
-
end
|
211
|
-
end
|
212
|
-
end
|
213
|
-
|
214
|
-
def make_pkg_task
|
215
|
-
pkg_tasks = ["#{package_name}/local/#{short_package_name}/bundle",
|
216
|
-
"#{package_name}/local/#{short_package_name}/lib"]
|
217
|
-
pkg_tasks += bin_files.map{|b| "#{package_name}/bin/#{b}" }
|
218
|
-
pkg_tasks += resource_files.map{|r| "#{package_name}/local/#{short_package_name}/#{r}" }
|
219
|
-
|
220
|
-
task :make_pkg => pkg_tasks
|
221
|
-
end
|
222
|
-
|
223
|
-
def rm_task
|
224
|
-
task :rm do
|
225
|
-
rm_rf package_name
|
226
|
-
end
|
227
|
-
end
|
228
|
-
|
229
|
-
def directory_tasks
|
230
|
-
directory "#{short_package_name}-pkg/Resources"
|
231
|
-
directory "#{short_package_name}-pkg/#{short_package_name}.pkg"
|
232
|
-
end
|
233
|
-
|
234
|
-
def distribution_file_task
|
235
|
-
erb_path = File.expand_path("../build/Distribution.erb", __FILE__)
|
236
|
-
|
237
|
-
file "#{short_package_name}-pkg/Distribution" do
|
238
|
-
src = File.read erb_path
|
239
|
-
erb = ERB.new(src)
|
240
|
-
|
241
|
-
File.open("#{short_package_name}-pkg/Distribution", "w") do |file|
|
242
|
-
file.puts erb.result(binding)
|
10
|
+
case os = RbConfig::CONFIG['host_os']
|
11
|
+
when /mswin|windows|cygwin|mingw/i
|
12
|
+
require 'packager/rake/windows_task'
|
13
|
+
Packager::Rake::WindowsTask.new(&block)
|
14
|
+
when /darwin/i
|
15
|
+
require 'packager/rake/mac_task'
|
16
|
+
Packager::Rake::MacTask.new(&block)
|
17
|
+
else
|
18
|
+
task :pkg do
|
19
|
+
puts "Don't know how to package for: #{os}"
|
243
20
|
end
|
244
21
|
end
|
245
22
|
end
|
246
23
|
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
file "#{short_package_name}-pkg/#{short_package_name}.pkg/PackageInfo" do
|
251
|
-
src = File.read erb_path
|
252
|
-
erb = ERB.new(src)
|
253
|
-
|
254
|
-
File.open("#{short_package_name}-pkg/#{short_package_name}.pkg/PackageInfo", "w") do |file|
|
255
|
-
file.puts erb.result(binding)
|
256
|
-
end
|
257
|
-
end
|
258
|
-
end
|
259
|
-
|
260
|
-
def bom_file_task
|
261
|
-
file "#{short_package_name}-pkg/#{short_package_name}.pkg/Bom" do
|
262
|
-
sh "mkbom -s #{package_name} #{short_package_name}-pkg/#{short_package_name}.pkg/Bom"
|
263
|
-
end
|
264
|
-
end
|
265
|
-
|
266
|
-
def payload_file_task
|
267
|
-
file "#{short_package_name}-pkg/#{short_package_name}.pkg/Payload" do
|
268
|
-
sh "cd #{package_name} && pax -wz -x cpio . > ../#{short_package_name}-pkg/#{short_package_name}.pkg/Payload"
|
269
|
-
end
|
270
|
-
end
|
271
|
-
|
272
|
-
def pkg_task
|
273
|
-
file "#{package_name}.pkg" => pkg_dependencies do
|
274
|
-
sh "pkgutil --flatten #{short_package_name}-pkg #{package_name}.pkg"
|
275
|
-
end
|
276
|
-
end
|
24
|
+
task name => "#{group}:pkg"
|
25
|
+
end
|
277
26
|
|
278
27
|
end
|
279
28
|
end
|
data/lib/packager/version.rb
CHANGED
File without changes
|
File without changes
|
@@ -0,0 +1,46 @@
|
|
1
|
+
[Setup]
|
2
|
+
AppName=<%= package_name %>
|
3
|
+
AppVersion=<%= version %>
|
4
|
+
DefaultDirName={pf}\<%= package_name %>
|
5
|
+
DefaultGroupName=<%= package_name %>
|
6
|
+
Compression=lzma2
|
7
|
+
SolidCompression=yes
|
8
|
+
; For Ruby expansion ~ 32MB (installed) - 12MB (installer)
|
9
|
+
ExtraDiskSpaceRequired=20971520
|
10
|
+
|
11
|
+
[Files]
|
12
|
+
Source: "rubyinstaller.exe"; DestDir: "{tmp}";
|
13
|
+
Source: "bin\*.*"; DestDir: "{app}\bin"; Flags: recursesubdirs;
|
14
|
+
Source: "local\*.*"; DestDir: "{app}\local"; Flags: recursesubdirs;
|
15
|
+
|
16
|
+
[UninstallDelete]
|
17
|
+
Type: filesandordirs; Name: "{app}\ruby"
|
18
|
+
|
19
|
+
[Registry]
|
20
|
+
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: "string"; ValueName: "<%= path_constant %>"; \
|
21
|
+
ValueData: "{app}";
|
22
|
+
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: "expandsz"; ValueName: "Path"; \
|
23
|
+
ValueData: "{olddata};{app}\bin"; Check: NeedsAddPath(ExpandConstant('{app}\bin'))
|
24
|
+
|
25
|
+
[Run]
|
26
|
+
Filename: "{tmp}\rubyinstaller.exe"; Parameters: "/silent /nocancel /noicons /dir=""{app}/ruby"""; \
|
27
|
+
Flags: shellexec waituntilterminated; StatusMsg: "Installing Ruby";
|
28
|
+
|
29
|
+
[Code]
|
30
|
+
|
31
|
+
function NeedsAddPath(Param: string): boolean;
|
32
|
+
var
|
33
|
+
OrigPath: string;
|
34
|
+
begin
|
35
|
+
if not RegQueryStringValue(HKEY_LOCAL_MACHINE,
|
36
|
+
'SYSTEM\CurrentControlSet\Control\Session Manager\Environment',
|
37
|
+
'Path', OrigPath)
|
38
|
+
then begin
|
39
|
+
Result := True;
|
40
|
+
exit;
|
41
|
+
end;
|
42
|
+
// look for the path with leading and trailing semicolon
|
43
|
+
// Pos() returns 0 if not found
|
44
|
+
Result := Pos(';' + Param + ';', ';' + OrigPath + ';') = 0;
|
45
|
+
end;
|
46
|
+
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: packager
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0.
|
5
|
+
version: 0.0.4
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Yehuda Katz
|
@@ -11,7 +11,7 @@ autorequire:
|
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
13
|
|
14
|
-
date: 2011-
|
14
|
+
date: 2011-06-09 00:00:00 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: bundler
|
@@ -35,12 +35,17 @@ extensions: []
|
|
35
35
|
extra_rdoc_files: []
|
36
36
|
|
37
37
|
files:
|
38
|
+
- README.md
|
38
39
|
- lib/packager.rb
|
39
|
-
- lib/packager/
|
40
|
-
- lib/packager/
|
40
|
+
- lib/packager/rake/base_task.rb
|
41
|
+
- lib/packager/rake/mac_task.rb
|
42
|
+
- lib/packager/rake/windows_task.rb
|
41
43
|
- lib/packager/rake_task.rb
|
42
44
|
- lib/packager/version.rb
|
43
45
|
- packager.gemspec
|
46
|
+
- resources/Distribution.erb
|
47
|
+
- resources/PackageInfo.erb
|
48
|
+
- resources/packager.iss.erb
|
44
49
|
homepage:
|
45
50
|
licenses: []
|
46
51
|
|
@@ -64,7 +69,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
64
69
|
requirements: []
|
65
70
|
|
66
71
|
rubyforge_project:
|
67
|
-
rubygems_version: 1.
|
72
|
+
rubygems_version: 1.8.5
|
68
73
|
signing_key:
|
69
74
|
specification_version: 3
|
70
75
|
summary: Packager your gem for Mac OS X
|