class Rake::PackageTask

Create a packaging task that will package the project into distributable files (e.g zip archive or tar files).

The PackageTask will create the following targets:

:package

Create all the requested package files.

:clobber_package

Delete all the package files. This target is automatically added to the main clobber target.

:repackage

Rebuild the package files from scratch, even if they are not out of date.

"package_dir/name-version.tgz"

Create a gzipped tar package (if need_tar is true).

"package_dir/name-version.tar.gz"

Create a gzipped tar package (if need_tar_gz is true).

"package_dir/name-version.tar.bz2"

Create a bzip2’d tar package (if need_tar_bz2 is true).

"package_dir/name-version.zip"

Create a zip package archive (if need_zip is true).

Example:

Rake::PackageTask.new("rake", "1.2.3") do |p|
  p.need_tar = true
  p.package_files.include("lib/**/*.rb")
end

Attributes

Name of the package (from the GEM Spec).

True if a gzipped tar file (tgz) should be produced (default is false).

True if a bzip2’d tar file (tar.bz2) should be produced (default is false).

True if a gzipped tar file (tar.gz) should be produced (default is false).

True if a xz’d tar file (tar.xz) should be produced (default is false)

True if a zip file should be produced (default is false)

Directory used to store the package files (default is ‘pkg’).

List of files to be included in the package.

Tar command for gzipped or bzip2ed archives. The default is ‘tar’.

Version of the package (e.g. ‘1.3.2’).

True if parent directory should be omitted (default is false)

Zip command for zipped archives. The default is ‘zip’.

Public Class Methods

Create a Package Task with the given name and version. Use :noversion as the version to build a package without a version or to provide a fully-versioned package name.

# File lib/rake/packagetask.rb, line 89
def initialize(name=nil, version=nil)
  init(name, version)
  yield self if block_given?
  define unless name.nil?
end

Public Instance Methods

Create the tasks defined by this task library.

# File lib/rake/packagetask.rb, line 112
def define
  fail "Version required (or :noversion)" if @version.nil?
  @version = nil if :noversion == @version

  desc "Build all the packages"
  task :package

  desc "Force a rebuild of the package files"
  task repackage: [:clobber_package, :package]

  desc "Remove package products"
  task :clobber_package do
    rm_r package_dir rescue nil
  end

  task clobber: [:clobber_package]

  [
    [need_tar, tgz_file, "z"],
    [need_tar_gz, tar_gz_file, "z"],
    [need_tar_bz2, tar_bz2_file, "j"],
    [need_tar_xz, tar_xz_file, "J"]
  ].each do |need, file, flag|
    if need
      task package: ["#{package_dir}/#{file}"]
      file "#{package_dir}/#{file}" =>
        [package_dir_path] + package_files do
        chdir(working_dir) { sh @tar_command, "#{flag}cvf", file, target_dir }
        mv "#{package_dir_path}/#{target_dir}", package_dir if without_parent_dir
      end
    end
  end

  if need_zip
    task package: ["#{package_dir}/#{zip_file}"]
    file "#{package_dir}/#{zip_file}" =>
      [package_dir_path] + package_files do
      chdir(working_dir) { sh @zip_command, "-r", zip_file, target_dir }
      mv "#{package_dir_path}/#{zip_file}", package_dir if without_parent_dir
    end
  end

  directory package_dir_path => @package_files do
    @package_files.each do |fn|
      f = File.join(package_dir_path, fn)
      fdir = File.dirname(f)
      mkdir_p(fdir) unless File.exist?(fdir)
      if File.directory?(fn)
        mkdir_p(f)
      else
        rm_f f
        safe_ln(fn, f)
      end
    end
  end
  self
end

Initialization that bypasses the “yield self” and “define” step.

# File lib/rake/packagetask.rb, line 96
def init(name, version)
  @name = name
  @version = version
  @package_files = Rake::FileList.new
  @package_dir = "pkg"
  @need_tar = false
  @need_tar_gz = false
  @need_tar_bz2 = false
  @need_tar_xz = false
  @need_zip = false
  @tar_command = "tar"
  @zip_command = "zip"
  @without_parent_dir = false
end

The directory this package will be built in

# File lib/rake/packagetask.rb, line 178
def package_dir_path
  "#{package_dir}/#{package_name}"
end

The name of this package

# File lib/rake/packagetask.rb, line 172
def package_name
  @version ? "#{@name}-#{@version}" : @name
end

The package name with .tar.bz2 added

# File lib/rake/packagetask.rb, line 196
def tar_bz2_file
  "#{package_name}.tar.bz2"
end

The package name with .tar.gz added

# File lib/rake/packagetask.rb, line 190
def tar_gz_file
  "#{package_name}.tar.gz"
end

The package name with .tar.xz added

# File lib/rake/packagetask.rb, line 202
def tar_xz_file
  "#{package_name}.tar.xz"
end

target directory relative to working_dir

# File lib/rake/packagetask.rb, line 217
def target_dir
  without_parent_dir ? "." : package_name
end

The package name with .tgz added

# File lib/rake/packagetask.rb, line 184
def tgz_file
  "#{package_name}.tgz"
end
# File lib/rake/packagetask.rb, line 212
def working_dir
  without_parent_dir ? package_dir_path : package_dir
end

The package name with .zip added

# File lib/rake/packagetask.rb, line 208
def zip_file
  "#{package_name}.zip"
end