omnibus 6.0.1 → 6.0.24

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -0
  3. data/lib/omnibus/build_version.rb +1 -1
  4. data/lib/omnibus/builder.rb +1 -1
  5. data/lib/omnibus/changelog.rb +1 -1
  6. data/lib/omnibus/compressors/dmg.rb +18 -6
  7. data/lib/omnibus/core_extensions/open_uri.rb +1 -1
  8. data/lib/omnibus/exceptions.rb +103 -103
  9. data/lib/omnibus/fetchers/net_fetcher.rb +8 -6
  10. data/lib/omnibus/generator_files/.kitchen.local.yml.erb +10 -0
  11. data/lib/omnibus/generator_files/.kitchen.yml.erb +41 -0
  12. data/lib/omnibus/generator_files/Gemfile.erb +3 -3
  13. data/lib/omnibus/git_repository.rb +1 -1
  14. data/lib/omnibus/licensing.rb +1 -0
  15. data/lib/omnibus/metadata.rb +15 -15
  16. data/lib/omnibus/packager.rb +11 -10
  17. data/lib/omnibus/packagers/appx.rb +4 -4
  18. data/lib/omnibus/packagers/base.rb +19 -0
  19. data/lib/omnibus/packagers/bff.rb +13 -13
  20. data/lib/omnibus/packagers/deb.rb +14 -14
  21. data/lib/omnibus/packagers/ips.rb +7 -7
  22. data/lib/omnibus/packagers/msi.rb +73 -25
  23. data/lib/omnibus/packagers/pkg.rb +10 -10
  24. data/lib/omnibus/packagers/pkgsrc.rb +5 -5
  25. data/lib/omnibus/packagers/rpm.rb +31 -31
  26. data/lib/omnibus/packagers/solaris.rb +2 -2
  27. data/lib/omnibus/packagers/windows_base.rb +2 -2
  28. data/lib/omnibus/project.rb +4 -0
  29. data/lib/omnibus/publishers/artifactory_publisher.rb +17 -17
  30. data/lib/omnibus/publishers/s3_publisher.rb +20 -6
  31. data/lib/omnibus/s3_cache.rb +5 -5
  32. data/lib/omnibus/s3_helpers.rb +6 -4
  33. data/lib/omnibus/software.rb +7 -12
  34. data/lib/omnibus/version.rb +1 -1
  35. data/lib/omnibus/whitelist.rb +1 -0
  36. data/omnibus.gemspec +6 -7
  37. data/spec/functional/builder_spec.rb +1 -1
  38. data/spec/functional/licensing_spec.rb +49 -49
  39. data/spec/functional/templating_spec.rb +3 -3
  40. data/spec/support/git_helpers.rb +5 -5
  41. data/spec/unit/changelog_spec.rb +7 -7
  42. data/spec/unit/changelogprinter_spec.rb +5 -5
  43. data/spec/unit/compressors/dmg_spec.rb +7 -2
  44. data/spec/unit/generator_spec.rb +6 -34
  45. data/spec/unit/manifest_diff_spec.rb +18 -18
  46. data/spec/unit/metadata_spec.rb +10 -19
  47. data/spec/unit/packager_spec.rb +7 -7
  48. data/spec/unit/packagers/base_spec.rb +17 -0
  49. data/spec/unit/packagers/deb_spec.rb +1 -1
  50. data/spec/unit/packagers/ips_spec.rb +1 -1
  51. data/spec/unit/packagers/msi_spec.rb +45 -0
  52. data/spec/unit/packagers/pkg_spec.rb +1 -1
  53. data/spec/unit/packagers/rpm_spec.rb +1 -46
  54. data/spec/unit/packagers/solaris_spec.rb +3 -3
  55. data/spec/unit/software_spec.rb +2 -53
  56. data/spec/unit/util_spec.rb +1 -1
  57. metadata +21 -28
@@ -22,16 +22,16 @@ module Omnibus
22
22
  include DownloadHelpers
23
23
 
24
24
  # Use 7-zip to extract 7z/zip for Windows
25
- WIN_7Z_EXTENSIONS = %w{.7z .zip}
25
+ WIN_7Z_EXTENSIONS = %w{.7z .zip}.freeze
26
26
 
27
27
  # tar probably has compression scheme linked in, otherwise for tarballs
28
- COMPRESSED_TAR_EXTENSIONS = %w{.tar.gz .tgz tar.bz2 .tar.xz .txz .tar.lzma}
28
+ COMPRESSED_TAR_EXTENSIONS = %w{.tar.gz .tgz tar.bz2 .tar.xz .txz .tar.lzma}.freeze
29
29
  TAR_EXTENSIONS = COMPRESSED_TAR_EXTENSIONS + [".tar"]
30
30
 
31
31
  ALL_EXTENSIONS = WIN_7Z_EXTENSIONS + TAR_EXTENSIONS
32
32
 
33
33
  # Digest types used for verifying file checksums
34
- DIGESTS = [:sha512, :sha256, :sha1, :md5]
34
+ DIGESTS = [:sha512, :sha256, :sha1, :md5].freeze
35
35
 
36
36
  #
37
37
  # A fetch is required if the downloaded_file (such as a tarball) does not
@@ -112,13 +112,15 @@ module Omnibus
112
112
  end
113
113
 
114
114
  #
115
- # The path on disk to the downloaded asset. This method requires the
116
- # presence of a +source_uri+.
115
+ # The path on disk to the downloaded asset. The filename is defined by
116
+ # +source :cached_name+. If ommited, then it comes from the software's
117
+ # +source :url+ value
117
118
  #
118
119
  # @return [String]
119
120
  #
120
121
  def downloaded_file
121
- filename = File.basename(source[:url], "?*")
122
+ filename = source[:cached_name] if source[:cached_name]
123
+ filename ||= File.basename(source[:url], "?*")
122
124
  File.join(Config.cache_dir, filename)
123
125
  end
124
126
 
@@ -0,0 +1,10 @@
1
+ #
2
+ # The .kitchen.local.yml takes preference and is compiled into the top-level
3
+ # .kitchen.yml. Uncomment the following section to use VMWare Fusion instead of
4
+ # the default Vagrant driver of VirtualBox.
5
+ #
6
+
7
+ # driver:
8
+ # provider: vmware_fusion
9
+ # customize:
10
+ # memsize: 4096
@@ -0,0 +1,41 @@
1
+ driver:
2
+ name: vagrant
3
+ forward_agent: yes
4
+ customize:
5
+ cpus: 2
6
+ memory: 2048
7
+ synced_folders:
8
+ - ['.', '/home/vagrant/<%= config[:name] %>']
9
+
10
+ provisioner:
11
+ name: chef_zero
12
+
13
+ platforms:
14
+ - name: centos-6
15
+ run_list: yum-epel::default
16
+ - name: centos-7
17
+ run_list: yum-epel::default
18
+ - name: debian-8
19
+ run_list: apt::default
20
+ - name: debian-9
21
+ run_list: apt::default
22
+ - name: freebsd-10
23
+ run_list: freebsd::portsnap
24
+ - name: freebsd-11
25
+ run_list: freebsd::portsnap
26
+ - name: ubuntu-14.04
27
+ run_list: apt::default
28
+ - name: ubuntu-16.04
29
+ run_list: apt::default
30
+ - name: ubuntu-18.04
31
+ run_list: apt::default
32
+
33
+ suites:
34
+ - name: default
35
+ run_list: omnibus::default
36
+ attributes:
37
+ omnibus:
38
+ build_user: vagrant
39
+ build_user_group: vagrant
40
+ build_user_password: vagrant
41
+ install_dir: /opt/<%= config[:name] %>
@@ -13,9 +13,9 @@ gem 'omnibus', '~> <%= Omnibus::VERSION.split('.')[0...-1].join('.') %>'
13
13
  # by running `bundle install --without development` to speed up build times.
14
14
  group :development do
15
15
  # Use Berkshelf for resolving cookbook dependencies
16
- gem 'berkshelf', '~> 3.3'
16
+ gem 'berkshelf'
17
17
 
18
18
  # Use Test Kitchen with Vagrant for converging the build environment
19
- gem 'test-kitchen', '~> 1.4'
20
- gem 'kitchen-vagrant', '~> 0.18'
19
+ gem 'test-kitchen',
20
+ gem 'kitchen-vagrant',
21
21
  end
@@ -37,7 +37,7 @@ module Omnibus
37
37
  end
38
38
 
39
39
  def git(cmd)
40
- shellout!("git #{cmd}", :cwd => repo_path).stdout
40
+ shellout!("git #{cmd}", cwd: repo_path).stdout
41
41
  end
42
42
  end
43
43
  end
@@ -657,6 +657,7 @@ EOH
657
657
  "AGPL-3.0", # GNU Affero General Public License v3
658
658
  "GPL-2.0", # GNU General Public License version 2.0
659
659
  "GPL-3.0", # GNU General Public License version 3.0
660
+ "LGPL-2.0", # GNU Library or "Lesser" General Public License version 2.0
660
661
  "LGPL-2.1", # GNU Library or "Lesser" General Public License version 2.1
661
662
  "LGPL-3.0", # GNU Library or "Lesser" General Public License version 3.0
662
663
  "HPND", # Historical Permission Notice and Disclaimer
@@ -46,24 +46,24 @@ module Omnibus
46
46
 
47
47
  data = {
48
48
  # Package
49
- basename: package.name,
50
- md5: package.md5,
51
- sha1: package.sha1,
52
- sha256: package.sha256,
53
- sha512: package.sha512,
54
- platform: platform_shortname,
49
+ basename: package.name,
50
+ md5: package.md5,
51
+ sha1: package.sha1,
52
+ sha256: package.sha256,
53
+ sha512: package.sha512,
54
+ platform: platform_shortname,
55
55
  platform_version: platform_version,
56
- arch: arch,
56
+ arch: arch,
57
57
 
58
58
  # Project
59
- name: project.name,
60
- friendly_name: project.friendly_name,
61
- homepage: project.homepage,
62
- version: project.build_version,
63
- iteration: project.build_iteration,
64
- license: project.license,
59
+ name: project.name,
60
+ friendly_name: project.friendly_name,
61
+ homepage: project.homepage,
62
+ version: project.build_version,
63
+ iteration: project.build_iteration,
64
+ license: project.license,
65
65
  version_manifest: project.built_manifest.to_hash,
66
- license_content: File.exist?(project.license_file_path) ? File.read(project.license_file_path) : "",
66
+ license_content: File.exist?(project.license_file_path) ? File.read(project.license_file_path) : "",
67
67
  }
68
68
 
69
69
  instance = new(package, data)
@@ -170,7 +170,7 @@ module Omnibus
170
170
  # rubocop:disable Lint/DuplicateCaseCondition
171
171
  def truncate_platform_version(platform_version, platform)
172
172
  case platform
173
- when "centos", "debian", "el", "fedora", "freebsd", "omnios", "pidora", "raspbian", "rhel", "sles", "suse", "smartos", "nexus", "ios_xr"
173
+ when "centos", "debian", "el", "fedora", "freebsd", "omnios", "pidora", "raspbian", "rhel", "sles", "suse", "smartos"
174
174
  # Only want MAJOR (e.g. Debian 7, OmniOS r151006, SmartOS 20120809T221258Z)
175
175
  platform_version.split(".").first
176
176
  when "aix", "alpine", "mac_os_x", "openbsd", "slackware", "solaris2", "opensuse", "opensuseleap", "ubuntu", "amazon"
@@ -38,17 +38,18 @@ module Omnibus
38
38
  # @return [Hash<String, Class>]
39
39
  #
40
40
  PLATFORM_PACKAGER_MAP = {
41
- "debian" => DEB,
42
- "fedora" => RPM,
43
- "suse" => RPM,
44
- "rhel" => RPM,
45
- "wrlinux" => RPM,
46
- "aix" => BFF,
47
- "solaris" => Solaris,
48
- "ips" => IPS,
49
- "windows" => [MSI, APPX],
41
+ "debian" => DEB,
42
+ "fedora" => RPM,
43
+ "suse" => RPM,
44
+ "rhel" => RPM,
45
+ "wrlinux" => RPM,
46
+ "amazon" => RPM,
47
+ "aix" => BFF,
48
+ "solaris" => Solaris,
49
+ "ips" => IPS,
50
+ "windows" => [MSI, APPX],
50
51
  "mac_os_x" => PKG,
51
- "smartos" => PKGSRC,
52
+ "smartos" => PKGSRC,
52
53
  }.freeze
53
54
 
54
55
  #
@@ -64,10 +64,10 @@ module Omnibus
64
64
  render_template(resource_path("AppxManifest.xml.erb"),
65
65
  destination: "#{windows_safe_path(project.install_dir)}/AppxManifest.xml",
66
66
  variables: {
67
- name: project.package_name,
68
- friendly_name: project.friendly_name,
69
- version: windows_package_version,
70
- maintainer: project.maintainer,
67
+ name: project.package_name,
68
+ friendly_name: project.friendly_name,
69
+ version: windows_package_version,
70
+ maintainer: project.maintainer,
71
71
  certificate_subject: certificate_subject.gsub('"', "&quot;"),
72
72
  }
73
73
  )
@@ -127,6 +127,25 @@ module Omnibus
127
127
  #
128
128
  expose :windows_safe_path
129
129
 
130
+ #
131
+ # Skip this packager during build process
132
+ #
133
+ # @example
134
+ # skip_package true
135
+ #
136
+ # @param [TrueClass, FalseClass] value
137
+ # whether to delay validation or not
138
+ #
139
+ # @return [TrueClass, FalseClass]
140
+ # whether to skip this packager type or not
141
+ def skip_packager(val = false)
142
+ unless val.is_a?(TrueClass) || val.is_a?(FalseClass)
143
+ raise InvalidValue.new(:skip_packager, "be TrueClass or FalseClass")
144
+ end
145
+ @skip_package ||= val
146
+ end
147
+ expose :skip_packager
148
+
130
149
  #
131
150
  # @!endgroup
132
151
  # --------------------------------------------------
@@ -19,12 +19,12 @@ module Omnibus
19
19
  # @return [Hash]
20
20
  SCRIPT_MAP = {
21
21
  # Default Omnibus naming
22
- preinst: "Pre-installation Script",
22
+ preinst: "Pre-installation Script",
23
23
  postinst: "Post-installation Script",
24
- config: "Configuration Script",
24
+ config: "Configuration Script",
25
25
  unconfig: "Unconfiguration Script",
26
- prerm: "Pre_rm Script",
27
- postrm: "Unconfiguration Script",
26
+ prerm: "Pre_rm Script",
27
+ postrm: "Unconfiguration Script",
28
28
  }.freeze
29
29
 
30
30
  id :bff
@@ -144,11 +144,11 @@ module Omnibus
144
144
  alt = path.gsub(/(:|,)/, "__")
145
145
  log.debug(log_key) { "Renaming #{path} to #{alt}" }
146
146
 
147
- File.rename(path, alt) if File.exists?(path)
147
+ File.rename(path, alt) if File.exist?(path)
148
148
 
149
149
  # Create a config script if needed based on resources/bff/config.erb
150
150
  config_script_path = File.join(scripts_staging_dir, "config")
151
- unless File.exists? config_script_path
151
+ unless File.exist? config_script_path
152
152
  render_template(resource_path("config.erb"),
153
153
  destination: "#{scripts_staging_dir}/config",
154
154
  variables: {
@@ -182,13 +182,13 @@ module Omnibus
182
182
  render_template(resource_path("gen.template.erb"),
183
183
  destination: File.join(staging_dir, "gen.template"),
184
184
  variables: {
185
- name: safe_base_package_name,
186
- install_dir: project.install_dir,
187
- friendly_name: project.friendly_name,
188
- version: bff_version,
189
- description: project.description,
190
- files: files,
191
- scripts: scripts,
185
+ name: safe_base_package_name,
186
+ install_dir: project.install_dir,
187
+ friendly_name: project.friendly_name,
188
+ version: bff_version,
189
+ description: project.description,
190
+ files: files,
191
+ scripts: scripts,
192
192
  }
193
193
  )
194
194
 
@@ -305,21 +305,21 @@ module Omnibus
305
305
  render_template(resource_path("control.erb"),
306
306
  destination: File.join(debian_dir, "control"),
307
307
  variables: {
308
- name: safe_base_package_name,
309
- version: safe_version,
310
- iteration: safe_build_iteration,
311
- vendor: vendor,
312
- license: license,
313
- architecture: safe_architecture,
314
- maintainer: project.maintainer,
308
+ name: safe_base_package_name,
309
+ version: safe_version,
310
+ iteration: safe_build_iteration,
311
+ vendor: vendor,
312
+ license: license,
313
+ architecture: safe_architecture,
314
+ maintainer: project.maintainer,
315
315
  installed_size: package_size,
316
- homepage: project.homepage,
317
- description: project.description,
318
- priority: priority,
319
- section: section,
320
- conflicts: project.conflicts,
321
- replaces: project.replaces,
322
- dependencies: project.runtime_dependencies,
316
+ homepage: project.homepage,
317
+ description: project.description,
318
+ priority: priority,
319
+ section: section,
320
+ conflicts: project.conflicts,
321
+ replaces: project.replaces,
322
+ dependencies: project.runtime_dependencies,
323
323
  }
324
324
  )
325
325
  end
@@ -223,16 +223,16 @@ module Omnibus
223
223
  # @return [String]
224
224
  #
225
225
  def symlinks_file
226
- if File.exists?(resource_path("#{safe_base_package_name}-symlinks.erb"))
226
+ if File.exist?(resource_path("#{safe_base_package_name}-symlinks.erb"))
227
227
  "#{safe_base_package_name}-symlinks.erb"
228
- elsif File.exists?(resource_path("symlinks.erb"))
228
+ elsif File.exist?(resource_path("symlinks.erb"))
229
229
  "symlinks.erb"
230
230
  end
231
231
  end
232
232
 
233
233
  #
234
234
  # A set of symbolic links to installed commands that
235
- #`pkgmogrify' will apply to the package manifest. Is called only when
235
+ # `pkgmogrify' will apply to the package manifest. Is called only when
236
236
  # "#{safe_base_package_name}-symlinks.erb" or "symlinks.erb" template resource
237
237
  # exists locally
238
238
  #
@@ -257,11 +257,11 @@ module Omnibus
257
257
  render_template(resource_path("gen.manifestfile.erb"),
258
258
  destination: pkg_metadata_file,
259
259
  variables: {
260
- name: safe_base_package_name,
260
+ name: safe_base_package_name,
261
261
  fmri_package_name: fmri_package_name,
262
- description: project.description,
263
- summary: project.friendly_name,
264
- arch: safe_architecture,
262
+ description: project.description,
263
+ summary: project.friendly_name,
264
+ arch: safe_architecture,
265
265
  }
266
266
  )
267
267
 
@@ -166,6 +166,29 @@ module Omnibus
166
166
  end
167
167
  expose :wix_light_extension
168
168
 
169
+ #
170
+ # Signal delay validation for wix light
171
+ #
172
+ # @example
173
+ # wix_light_deplay_validation true
174
+ #
175
+ # @param [TrueClass, FalseClass] value
176
+ # whether to delay validation or not
177
+ #
178
+ # @return [String]
179
+ # whether we're a bundle or not
180
+ def wix_light_delay_validation(val = false)
181
+ unless val.is_a?(TrueClass) || val.is_a?(FalseClass)
182
+ raise InvalidValue.new(:iwix_light_delay_validation, "be TrueClass or FalseClass")
183
+ end
184
+ @delay_validation ||= val
185
+ unless @delay_validation
186
+ return ""
187
+ end
188
+ "-sval"
189
+ end
190
+ expose :wix_light_delay_validation
191
+
169
192
  #
170
193
  # Set the wix candle extensions to load
171
194
  #
@@ -225,6 +248,29 @@ module Omnibus
225
248
  end
226
249
  expose :fast_msi
227
250
 
251
+ #
252
+ # Set or retrieve the localization. Take a look at
253
+ # this list[https://www.firegiant.com/wix/tutorial/user-interface/do-you-speak-english/]
254
+ # of valid localizations.
255
+ #
256
+ # @example
257
+ # localization 'de-de'
258
+ #
259
+ # @param [String] val
260
+ # the localization to set
261
+ #
262
+ # @return [String]
263
+ # the set localization
264
+ #
265
+ def localization(val = "en-us")
266
+ unless val.is_a?(String)
267
+ raise InvalidValue.new(:localization, "be a String")
268
+ end
269
+
270
+ @localization ||= val
271
+ end
272
+ expose :localization
273
+
228
274
  #
229
275
  # Discovers a path to a gem/file included in a gem under the install directory.
230
276
  #
@@ -288,12 +334,12 @@ module Omnibus
288
334
  # @return [void]
289
335
  #
290
336
  def write_localization_file
291
- render_template(resource_path("localization-en-us.wxl.erb"),
292
- destination: "#{staging_dir}/localization-en-us.wxl",
337
+ render_template(resource_path("localization-#{localization}.wxl.erb"),
338
+ destination: "#{staging_dir}/localization-#{localization}.wxl",
293
339
  variables: {
294
- name: project.package_name,
340
+ name: project.package_name,
295
341
  friendly_name: project.friendly_name,
296
- maintainer: project.maintainer,
342
+ maintainer: project.maintainer,
297
343
  }
298
344
  )
299
345
  end
@@ -307,12 +353,12 @@ module Omnibus
307
353
  render_template(resource_path("parameters.wxi.erb"),
308
354
  destination: "#{staging_dir}/parameters.wxi",
309
355
  variables: {
310
- name: project.package_name,
311
- friendly_name: project.friendly_name,
312
- maintainer: project.maintainer,
313
- upgrade_code: upgrade_code,
314
- parameters: parameters,
315
- version: windows_package_version,
356
+ name: project.package_name,
357
+ friendly_name: project.friendly_name,
358
+ maintainer: project.maintainer,
359
+ upgrade_code: upgrade_code,
360
+ parameters: parameters,
361
+ version: windows_package_version,
316
362
  display_version: msi_display_version,
317
363
  }
318
364
  )
@@ -356,11 +402,11 @@ module Omnibus
356
402
  render_template(resource_path("source.wxs.erb"),
357
403
  destination: "#{staging_dir}/source.wxs",
358
404
  variables: {
359
- name: project.package_name,
405
+ name: project.package_name,
360
406
  friendly_name: project.friendly_name,
361
- maintainer: project.maintainer,
362
- hierarchy: hierarchy,
363
- fastmsi: fast_msi,
407
+ maintainer: project.maintainer,
408
+ hierarchy: hierarchy,
409
+ fastmsi: fast_msi,
364
410
  wix_install_dir: wix_install_dir,
365
411
  }
366
412
  )
@@ -375,14 +421,14 @@ module Omnibus
375
421
  render_template(resource_path("bundle.wxs.erb"),
376
422
  destination: "#{staging_dir}/bundle.wxs",
377
423
  variables: {
378
- name: project.package_name,
379
- friendly_name: project.friendly_name,
380
- maintainer: project.maintainer,
381
- upgrade_code: upgrade_code,
382
- parameters: parameters,
383
- version: windows_package_version,
424
+ name: project.package_name,
425
+ friendly_name: project.friendly_name,
426
+ maintainer: project.maintainer,
427
+ upgrade_code: upgrade_code,
428
+ parameters: parameters,
429
+ version: windows_package_version,
384
430
  display_version: msi_display_version,
385
- msi: windows_safe_path(Config.package_dir, msi_name),
431
+ msi: windows_safe_path(Config.package_dir, msi_name),
386
432
  }
387
433
  )
388
434
  end
@@ -465,11 +511,12 @@ module Omnibus
465
511
  <<-EOH.split.join(" ").squeeze(" ").strip
466
512
  light.exe
467
513
  -nologo
514
+ #{wix_light_delay_validation}
468
515
  -ext WixUIExtension
469
516
  -ext WixBalExtension
470
517
  #{wix_extension_switches(wix_light_extensions)}
471
- -cultures:en-us
472
- -loc "#{windows_safe_path(staging_dir, 'localization-en-us.wxl')}"
518
+ -cultures:#{localization}
519
+ -loc "#{windows_safe_path(staging_dir, "localization-#{localization}.wxl")}"
473
520
  bundle.wixobj
474
521
  -out "#{out_file}"
475
522
  EOH
@@ -477,10 +524,11 @@ module Omnibus
477
524
  <<-EOH.split.join(" ").squeeze(" ").strip
478
525
  light.exe
479
526
  -nologo
527
+ #{wix_light_delay_validation}
480
528
  -ext WixUIExtension
481
529
  #{wix_extension_switches(wix_light_extensions)}
482
- -cultures:en-us
483
- -loc "#{windows_safe_path(staging_dir, 'localization-en-us.wxl')}"
530
+ -cultures:#{localization}
531
+ -loc "#{windows_safe_path(staging_dir, "localization-#{localization}.wxl")}"
484
532
  project-files.wixobj source.wixobj
485
533
  -out "#{out_file}"
486
534
  EOH