Class: Omnibus::Project

Inherits:
Object
  • Object
show all
Includes:
Cleanroom, Digestable, Logging, NullArgumentable, Sugarable, Util
Defined in:
lib/omnibus/project.rb

Constant Summary

Constants included from Util

Util::SHELLOUT_OPTIONS

Constants included from NullArgumentable

NullArgumentable::NULL

Instance Attribute Summary collapse

DSL methods collapse

Public API collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Util

#copy_file, #create_directory, #create_file, #create_link, included, #remove_directory, #remove_file, #shellout, #shellout!, #windows_safe_path

Methods included from Sugarable

extended, included, #node

Methods included from NullArgumentable

included, #null?

Methods included from Logging

included

Methods included from Digestable

#digest, #digest_directory, included

Constructor Details

#initialize(filepath = nil, manifest = nil) ⇒ Project

Returns a new instance of Project



73
74
75
76
# File 'lib/omnibus/project.rb', line 73

def initialize(filepath = nil, manifest=nil)
  @filepath = filepath
  @manifest = manifest
end

Instance Attribute Details

#manifestObject (readonly)

Returns the value of attribute manifest



64
65
66
# File 'lib/omnibus/project.rb', line 64

def manifest
  @manifest
end

Class Method Details

.load(name, manifest = nil) ⇒ Project

Parameters:

  • name (String)

    the name to the project definition to load from disk

Returns:



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/omnibus/project.rb', line 33

def load(name, manifest=nil)
  loaded_projects[name] ||= begin
    filepath = Omnibus.project_path(name)

    if filepath.nil?
      raise MissingProject.new(name)
    else
      log.internal(log_key) do
        "Loading project `#{name}' from `#{filepath}'."
      end
    end

    instance = new(filepath, manifest)
    instance.evaluate_file(filepath)
    instance.load_dependencies
    instance
  end
end

Instance Method Details

#<=>(other) ⇒ 1, ...

Comparator for two projects (name)

Returns:

  • (1, 0, -1)


966
967
968
# File 'lib/omnibus/project.rb', line 966

def <=>(other)
  self.name <=> other.name
end

#==(other) ⇒ true, false Also known as: eql?

Determine if two projects are identical.

Parameters:

Returns:

  • (true, false)


1117
1118
1119
# File 'lib/omnibus/project.rb', line 1117

def ==(other)
  self.hash == other.hash
end

#buildObject



1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
# File 'lib/omnibus/project.rb', line 1001

def build
  FileUtils.rm_rf(install_dir)
  FileUtils.mkdir_p(install_dir)

  softwares.each do |software|
    software.build_me
  end

  write_json_manifest
  write_text_manifest
  HealthCheck.run!(self)
  package_me
  compress_me
end

#build_git_revision(val = NULL) ⇒ Object

Set or retrieve the git revision of the omnibus project being built.

If not set by the user, and the current workding directory is a git directory, it will return the revision of the current working directory.



388
389
390
391
392
393
394
# File 'lib/omnibus/project.rb', line 388

def build_git_revision(val = NULL)
  if null?(val)
    @build_git_revision ||= get_local_revision
  else
    @build_git_revision = val
  end
end

#build_iteration(val = NULL) ⇒ Fixnum

Set or retrieve the build iteration of the project. Defaults to 1 if not otherwise set.

Examples:

build_iteration 5

Parameters:

  • val (Fixnum) (defaults to: NULL)

    the build iteration number

Returns:

  • (Fixnum)


409
410
411
412
413
414
415
# File 'lib/omnibus/project.rb', line 409

def build_iteration(val = NULL)
  if null?(val)
    @build_iteration || 1
  else
    @build_iteration = val
  end
end

#build_meObject

Download and build the project. Preserved for backwards compatibility.



1039
1040
1041
1042
1043
# File 'lib/omnibus/project.rb', line 1039

def build_me
  # Download all softwares in parallel
  download
  build
end

#build_version(val = NULL, &block) ⇒ String

Set or retrieve the version of the project.

When using the :git source, by default the output format of the build_version is semver. This can be modified using the :output_format parameter to any of the methods of BuildVersion. For example:

build version do
  source :git, from_dependency: 'chef'
  output_format :git_describe
end

Examples:

Using a string

build_version '1.0.0'

From git

build_version do
  source :git
end

From the version of a dependency

build_version do
  source :version, from_dependency: 'chef'
end

From git of a dependency

build_version do
  source :git, from_dependency: 'chef'
end

Parameters:

  • val (String) (defaults to: NULL)

    the build version to set

  • block (Proc)

    the block to run when constructing the build_version

Returns:

  • (String)

See Also:



361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
# File 'lib/omnibus/project.rb', line 361

def build_version(val = NULL, &block)
  if block && !null?(val)
    raise Error, 'You cannot specify additional parameters to ' \
      '#build_version when a block is given!'
  end

  if block
    @build_version_dsl = BuildVersionDSL.new(&block)
  else
    if null?(val)
      @build_version_dsl.build_version
    else
      @build_version_dsl = BuildVersionDSL.new(val)
    end
  end
end

#build_version_dslBuildVersionDSL

The DSL for this build version.

Returns:



901
902
903
# File 'lib/omnibus/project.rb', line 901

def build_version_dsl
  @build_version_dsl
end

#built_manifestObject

Generate a version manifest of the loaded software sources.



984
985
986
987
988
989
990
991
# File 'lib/omnibus/project.rb', line 984

def built_manifest
  log.info(log_key) { "Building version manifest" }
  m = Omnibus::Manifest.new(build_version, build_git_revision)
  softwares.each do |software|
    m.add(software.name, software.manifest_entry)
  end
  m
end

#compress(id, &block) ⇒ Object

Add or override a customization for the compressor with the given id. When given multiple blocks with the same id, they are evaluated _in order_, so the last block evaluated will take precedence over the previous ones.

If multiple compress blocks are specified, the “most prefered” one for the current system will be used.

Examples:

With customization

compress :dmg do
  window_bounds '10, 20, 30, 40'
end

Without customization

compress :tgz

Parameters:

  • id (Symbol)

    the id of the compressor to customize



460
461
462
463
464
465
466
# File 'lib/omnibus/project.rb', line 460

def compress(id, &block)
  if block
    compressors[id] << block
  else
    compressors[id] << Proc.new {}
  end
end

#compress_meObject



1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
# File 'lib/omnibus/project.rb', line 1073

def compress_me
  destination = File.expand_path('pkg', Config.project_root)

  # Create the destination directory
  unless File.directory?(destination)
    FileUtils.mkdir_p(destination)
  end

  # Evaluate any compressor-specific blocks, in order.
  compressors[compressor.id].each do |block|
    compressor.evaluate(&block)
  end

  # Run the actual compressor
  compressor.run!

  # Copy the compressed package and metadata back into the workspace, if it
  # exists
  package_path = File.join(Config.package_dir, compressor.package_name)

  if File.file?(package_path)
    FileUtils.cp(package_path, destination)
    FileUtils.cp("#{package_path}.metadata.json", destination)
  end
end

#compressor~Compressor::Base

Instantiate a new instance of the best compressor for this system.

Returns:



892
893
894
# File 'lib/omnibus/project.rb', line 892

def compressor
  @compressor ||= Compressor.for_current_system(compressors.keys).new(self)
end

#compressorsHash<Symbol, Array<Proc>>

The list of compressors, in the following format:

{
  id: [#<Proc:0x001>, #<Proc:0x002>],
  # ...
}

Returns:

  • (Hash<Symbol, Array<Proc>>)

    the compressor blocks, indexed by key



883
884
885
# File 'lib/omnibus/project.rb', line 883

def compressors
  @compressors ||= Hash.new { |h, k| h[k] = [] }
end

#config_file(val) ⇒ Array<String>

Add a config file.

Examples:

config_file '/path/to/config.rb'

Parameters:

  • val (String)

    the name of a config file of your software

Returns:

  • (Array<String>)

    the list of current config files



653
654
655
656
# File 'lib/omnibus/project.rb', line 653

def config_file(val)
  config_files << val
  config_files.dup
end

#config_filesArray<String>

The list of config files for this software.

Returns:

  • (Array<String>)


788
789
790
# File 'lib/omnibus/project.rb', line 788

def config_files
  @config_files ||= []
end

#conflict(val) ⇒ Array<String>

Add to the list of packages this one conflicts with.

Examples:

conflicts 'foo'
conflicts 'bar'

Parameters:

  • val (String)

    the conflict to add

Returns:

  • (Array<String>)

    the list of conflicts



315
316
317
318
# File 'lib/omnibus/project.rb', line 315

def conflict(val)
  conflicts << val
  conflicts.dup
end

#conflictsArray<String>

The list of things this project conflicts with.

Returns:

  • (Array<String>)


817
818
819
# File 'lib/omnibus/project.rb', line 817

def conflicts
  @conflicts ||= []
end

#culpritSoftware?

The software definition which dirtied this project.

Returns:



948
949
950
# File 'lib/omnibus/project.rb', line 948

def culprit
  @culprit
end

#default_rootString

The default root where a project should be installed. On Windows-based systems, this value defaults to C:. On non-Windows systems, this value defaults to /opt.

Examples:

install_dir "#{default_root}/chef" #=> Produces +C:/chef+ on Windows and
                                   #=> +/opt/chef+ on Linux

Returns:

  • (String)


191
192
193
194
195
196
197
# File 'lib/omnibus/project.rb', line 191

def default_root
  if windows?
    'C:'
  else
    '/opt'
  end
end

#dependenciesArray<String>

The list of software dependencies for this project. These is the software that comprises your project, and is distinct from runtime dependencies.

Parameters:

  • (Array<String>)

Returns:

  • (Array<String>)

See Also:



768
769
770
# File 'lib/omnibus/project.rb', line 768

def dependencies
  @dependencies ||= []
end

#dependency(val) ⇒ Array<String>

Add a software dependency.

Note that this is a *build time* dependency. If you need to specify an external dependency that is required at runtime, see #runtime_dependency instead.

Examples:

dependency 'foo'
dependency 'bar'

Parameters:

  • val (String)

    the name of a Software dependency

Returns:

  • (Array<String>)

    the list of dependencies



595
596
597
598
# File 'lib/omnibus/project.rb', line 595

def dependency(val)
  dependencies << val
  dependencies.dup
end

#dependency?(software) ⇒ true, false

Indicates whether the given software is defined as a software component of this project.

Parameters:

  • software (String, Software)

    the software or name of the software to find

Returns:

  • (true, false)


914
915
916
917
# File 'lib/omnibus/project.rb', line 914

def dependency?(software)
  name = software.is_a?(Software) ? software.name : software
  dependencies.include?(name)
end

#description(val = NULL) ⇒ String

Set or retrieve the project description.

Examples:

description 'This is my description'

Parameters:

  • val (String) (defaults to: NULL)

    the project description

Returns:

  • (String)


272
273
274
275
276
277
278
# File 'lib/omnibus/project.rb', line 272

def description(val = NULL)
  if null?(val)
    @description || "The full stack of #{name}"
  else
    @description = val
  end
end

#dirty!(software) ⇒ true, false

Dirty the cache for this project. This can be called by other projects, install path cache, or software definitions to invalidate the cache for this project.

Parameters:

  • software (Software)

    the software that dirtied the cache

Returns:

  • (true, false)

Raises:



938
939
940
941
# File 'lib/omnibus/project.rb', line 938

def dirty!(software)
  raise ProjectAlreadyDirty.new(self) if culprit
  @culprit = software
end

#dirty?true, false

Determine if the cache for this project is dirty.

Returns:

  • (true, false)


957
958
959
# File 'lib/omnibus/project.rb', line 957

def dirty?
  !!culprit
end

#downloadObject



993
994
995
996
997
998
999
# File 'lib/omnibus/project.rb', line 993

def download
  ThreadPool.new(Config.workers) do |pool|
    softwares.each do |software|
      pool.schedule { software.fetch }
    end
  end
end

#exclude(pattern) ⇒ Array<String>

Add a new exclusion pattern for a list of files or folders to exclude when making the package.

Examples:

exclude '.git'

Parameters:

  • pattern (String)

    the thing to exclude

Returns:

  • (Array<String>)

    the list of current exclusions



635
636
637
638
# File 'lib/omnibus/project.rb', line 635

def exclude(pattern)
  exclusions << pattern
  exclusions.dup
end

#exclusionsArray<String>

The list of exclusions for this project.

Returns:

  • (Array<String>)


835
836
837
# File 'lib/omnibus/project.rb', line 835

def exclusions
  @exclusions ||= []
end

#extra_package_file(val) ⇒ Array<String>

Add other files or dirs outside of install_dir. These files retain their relative paths inside the scratch directory:

/path/to/foo.txt #=> /tmp/package/path/to/foo.txt

Examples:

extra_package_file '/path/to/file'

Parameters:

  • val (String)

    the name of a dir or file to include in build

Returns:

  • (Array<String>)

    the list of current extra package files



675
676
677
678
# File 'lib/omnibus/project.rb', line 675

def extra_package_file(val)
  extra_package_files << val
  extra_package_files.dup
end

#extra_package_files(val = NULL) ⇒ Array<String>

The list of files and directories used to build this project.

Returns:

  • (Array<String>)


797
798
799
# File 'lib/omnibus/project.rb', line 797

def extra_package_files(val = NULL)
  @extra_package_files ||= []
end

#filepathString?

The path (on disk) where this project came from. Warning: this can be nil if a project was dynamically created!

Returns:

  • (String, nil)


778
779
780
# File 'lib/omnibus/project.rb', line 778

def filepath
  @filepath
end

#files_pathString

Path to the /files directory in the omnibus project. This directory can contain arbritary files used by the project.

Examples:

patch = File.join(files_path, 'rubygems', 'patch.rb')

Returns:

  • (String)

    path to the files directory



210
211
212
# File 'lib/omnibus/project.rb', line 210

def files_path
  File.expand_path("#{Config.project_root}/files")
end

#friendly_name(val = NULL) ⇒ String

Set or retrieve a friendly name for the project. This defaults to the capitalized name if not specified.

Examples:

friendly_name 'Chef'

Parameters:

  • val (String) (defaults to: NULL)

    the name to set

Returns:

  • (String)


120
121
122
123
124
125
126
# File 'lib/omnibus/project.rb', line 120

def friendly_name(val = NULL)
  if null?(val)
    @friendly_name || name.capitalize
  else
    @friendly_name = val
  end
end

#hashFixnum

The unique “hash” for this project.

Returns:

  • (Fixnum)

See Also:

  • Omnibus::Project.((#shasum)


1106
1107
1108
# File 'lib/omnibus/project.rb', line 1106

def hash
  shasum.hash
end

#homepage(val = NULL) ⇒ String

**[Required]** Set or retrive the package homepage.

Examples:

homepage 'https://www.getchef.com'

Parameters:

  • val (String) (defaults to: NULL)

    the homepage for the project

Returns:

  • (String)

Raises:



252
253
254
255
256
257
258
# File 'lib/omnibus/project.rb', line 252

def homepage(val = NULL)
  if null?(val)
    @homepage || raise(MissingRequiredAttribute.new(self, :homepage, 'https://www.getchef.com'))
  else
    @homepage = val
  end
end

#install_dir(val = NULL) ⇒ String

**[Required]** Set or retrieve the path at which the project should be installed by the generated package.

Even on Windows-based systems, this path should be the Unix-like path, since that's what Ruby expects. In the event ++ is used as a file separator, it will be replaced with /. This method also attempts to remove duplicate slashes which might be caused as a result of string interpolation.

Examples:

install_dir '/opt/chef'

Parameters:

  • val (String) (defaults to: NULL)

    the install path to set

Returns:

  • (String)

Raises:



171
172
173
174
175
176
177
# File 'lib/omnibus/project.rb', line 171

def install_dir(val = NULL)
  if null?(val)
    @install_dir || raise(MissingRequiredAttribute.new(self, :install_dir, '/opt/chef'))
  else
    @install_dir = val.gsub('\\', '/').squeeze('/').chomp('/')
  end
end

#json_manifest_path(path = NULL) ⇒ String

Location of json-formated version manifest, written at at the end of the build. If no path is specified install_dir/version-manifest.json is used.

Examples:

json_manifest_path

Returns:

  • (String)


704
705
706
707
708
709
710
# File 'lib/omnibus/project.rb', line 704

def json_manifest_path(path = NULL)
  if null?(path)
    @json_manifest_path || File.join(install_dir, "version-manifest.json")
  else
    @json_manifest_path=path
  end
end

#libraryLibrary

The library for this Omnibus project.

Returns:



924
925
926
# File 'lib/omnibus/project.rb', line 924

def library
  @library ||= Library.new(self)
end

#load_dependenciestrue

Recursively load all the dependencies for this project.

Returns:

  • (true)


750
751
752
753
754
755
756
# File 'lib/omnibus/project.rb', line 750

def load_dependencies
  dependencies.each do |dependency|
    Software.load(self, dependency, manifest)
  end

  true
end

#maintainer(val = NULL) ⇒ String

**[Required]** Set or retrieve the the package maintainer.

Examples:

maintainer 'Chef Software, Inc.'

Parameters:

  • val (String) (defaults to: NULL)

    the name of the maintainer

Returns:

  • (String)

Raises:



229
230
231
232
233
234
235
# File 'lib/omnibus/project.rb', line 229

def maintainer(val = NULL)
  if null?(val)
    @maintainer || raise(MissingRequiredAttribute.new(self, :maintainer, 'Chef Software, Inc.'))
  else
    @maintainer = val
  end
end

#name(val = NULL) ⇒ String

**[Required]** Set or retrieve the name of the project.

Examples:

name 'chef'

Parameters:

  • val (String) (defaults to: NULL)

    the name to set

Returns:

  • (String)

Raises:



99
100
101
102
103
104
105
# File 'lib/omnibus/project.rb', line 99

def name(val = NULL)
  if null?(val)
    @name || raise(MissingRequiredAttribute.new(self, :name, 'hamlet'))
  else
    @name = val
  end
end

#ohaiOhai

A proxy method to the underlying Ohai system.

Examples:

ohai['platform_family']

Returns:



689
690
691
# File 'lib/omnibus/project.rb', line 689

def ohai
  Ohai
end

#override(name, val = NULL) ⇒ Hash

Set or retrieve the overrides hash for one piece of software being overridden. Calling it as a setter does not merge hash entries and it will set all the overrides for a given software definition.

Examples:

override 'chef', version: '1.2.3'

Parameters:

  • val (Hash) (defaults to: NULL)

    the value to override

Returns:

  • (Hash)


506
507
508
509
510
511
512
# File 'lib/omnibus/project.rb', line 506

def override(name, val = NULL)
  if null?(val)
    overrides[name.to_sym]
  else
    overrides[name.to_sym] = val
  end
end

#overridesHash

Retrieve the list of overrides for all software being overridden.

Returns:

  • (Hash)


844
845
846
# File 'lib/omnibus/project.rb', line 844

def overrides
  @overrides ||= {}
end

#package(id, &block) ⇒ Object

Add or override a customization for the packager with the given id. When given multiple blocks with the same id, they are evaluated _in order_, so the last block evaluated will take precedence over the previous ones.

Examples:

package :id do
  key 'value'
end

Parameters:

  • id (Symbol)

    the id of the packager to customize



431
432
433
434
435
436
437
# File 'lib/omnibus/project.rb', line 431

def package(id, &block)
  unless block
    raise InvalidValue.new(:package, 'have a block')
  end

  packagers[id] << block
end

#package_group(val = NULL) ⇒ String

Set or retrieve the group the package should install as. This varies with operating system and may be ignored if the underlying packager does not support it.

Defaults to Ohai. If +Ohai+ is nil, it defaults to “root”.

Examples:

package_group 'build'

Parameters:

  • val (String) (defaults to: NULL)

    the group to use for the package build

Returns:

  • (String)


531
532
533
534
535
536
537
# File 'lib/omnibus/project.rb', line 531

def package_group(val = NULL)
  if null?(val)
    @package_group || Ohai['root_group'] || 'root'
  else
    @package_group = val
  end
end

#package_meObject



1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
# File 'lib/omnibus/project.rb', line 1048

def package_me
  destination = File.expand_path('pkg', Config.project_root)

  # Create the destination directory
  unless File.directory?(destination)
    FileUtils.mkdir_p(destination)
  end

  # Evaluate any packager-specific blocks, in order.
  packagers[packager.id].each do |block|
    packager.evaluate(&block)
  end

  # Run the actual packager
  packager.run!

  # Copy the generated package and metadata back into the workspace
  package_path = File.join(Config.package_dir, packager.package_name)
  FileUtils.cp(package_path, destination, preserve: true)
  FileUtils.cp("#{package_path}.metadata.json", destination, preserve: true)
end

#package_name(val = NULL) ⇒ String

Set or retrieve the package name of the project. Defaults to the package name defaults to the project name.

Examples:

package_name 'com.chef.project'

Parameters:

  • val (String) (defaults to: NULL)

    the package name to set

Returns:

  • (String)


141
142
143
144
145
146
147
# File 'lib/omnibus/project.rb', line 141

def package_name(val = NULL)
  if null?(val)
    @package_name || name
  else
    @package_name = val
  end
end

#package_scripts_path(arg = NULL) ⇒ String

The path to the package scripts directory for this project. These are optional scripts that can be bundled into the resulting package for running at various points in the package management lifecycle.

These scripts and their names vary with operating system.

Returns:

  • (String)


569
570
571
572
573
574
575
# File 'lib/omnibus/project.rb', line 569

def package_scripts_path(arg = NULL)
  if null?(arg)
    @package_scripts_path || "#{Config.project_root}/package-scripts/#{name}"
  else
    @package_scripts_path = File.expand_path(arg)
  end
end

#package_user(val = NULL) ⇒ String

Set or retrieve the user the package should install as. This varies with operating system, and may be ignored if the underlying packager does not support it.

Defaults to “root”.

Examples:

package_user 'build'

Parameters:

  • val (String) (defaults to: NULL)

    the user to use for the package build

Returns:

  • (String)


484
485
486
487
488
489
490
# File 'lib/omnibus/project.rb', line 484

def package_user(val = NULL)
  if null?(val)
    @package_user || 'root'
  else
    @package_user = val
  end
end

#packager~Packager::Base

Instantiate a new instance of the best packager for this system.

Returns:



868
869
870
# File 'lib/omnibus/project.rb', line 868

def packager
  @packager ||= Packager.for_current_system.new(self)
end

#packagersHash<Symbol, Array<Proc>>

The list of packagers, in the following format:

{
  id: [#<Proc:0x001>, #<Proc:0x002>],
  # ...
}

Returns:

  • (Hash<Symbol, Array<Proc>>)

    the packager blocks, indexed by key



859
860
861
# File 'lib/omnibus/project.rb', line 859

def packagers
  @packagers ||= Hash.new { |h, k| h[k] = [] }
end

#replace(val = NULL) ⇒ String

Add to the list of packages this one replaces.

This should only be used when renaming a package and obsoleting the old name of the package. **Setting this to the same name as package_name will cause RPM upgrades to fail.**

Examples:

replace 'the-old-package'

Parameters:

  • val (String) (defaults to: NULL)

    the name of the package to replace

Returns:

  • (String)


296
297
298
299
# File 'lib/omnibus/project.rb', line 296

def replace(val = NULL)
  replaces << val
  replaces.dup
end

#replacesArray<String>

The list of things this project replaces with.

Returns:

  • (Array<String>)


826
827
828
# File 'lib/omnibus/project.rb', line 826

def replaces
  @replaces ||= []
end

#resources_path(val = NULL) ⇒ String

Set or retrieve the path to the resources on disk for use in packagers.

Examples:

resources_path '/path/to/resources'

Parameters:

  • val (String) (defaults to: NULL)

    the path where resources live

Returns:

  • (String)


551
552
553
554
555
556
557
# File 'lib/omnibus/project.rb', line 551

def resources_path(val = NULL)
  if null?(val)
    @resources_path || "#{Config.project_root}/resources/#{name}"
  else
    @resources_path = File.expand_path(val)
  end
end

#runtime_dependenciesArray<String>

The list of software dependencies for this project.

These is the software that is used at runtime for your project.

Returns:

  • (Array<String>)


808
809
810
# File 'lib/omnibus/project.rb', line 808

def runtime_dependencies
  @runtime_dependencies ||= []
end

#runtime_dependency(val) ⇒ Array<String>

Add a package that is a runtime dependency of this project.

This is distinct from a build-time dependency, which should correspond to a software definition.

Examples:

runtime_dependency 'foo'

Parameters:

  • val (String)

    the name of the runtime dependency

Returns:

  • (Array<String>)

    the list of runtime dependencies



616
617
618
619
# File 'lib/omnibus/project.rb', line 616

def runtime_dependency(val)
  runtime_dependencies << val
  runtime_dependencies.dup
end

#shasumString

The unique SHA256 for this project.

A project is defined by its name, its build_version, its install_dir, and any overrides (as JSON). Additionally, if provided, the actual file contents are included in the SHA to ensure uniqueness.

Returns:

  • (String)


1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
# File 'lib/omnibus/project.rb', line 1131

def shasum
  @shasum ||= begin
    digest = Digest::SHA256.new

    update_with_string(digest, name)
    update_with_string(digest, install_dir)
    update_with_string(digest, JSON.fast_generate(overrides))

    if filepath && File.exist?(filepath)
      update_with_file_contents(digest, filepath)
    else
      update_with_string(digest, '<DYNAMIC>')
    end

    digest.hexdigest
  end
end

#softwaresArray<Omnibus::Software>

Cache the build order so we don't re-compute

Returns:



975
976
977
# File 'lib/omnibus/project.rb', line 975

def softwares
  @softwares ||= library.build_order
end

#text_manifest_path(path = NULL) ⇒ String

Location of text-formatted manifest. (install_dir/version-manifest.txt if none is provided)

This manifest uses the same format used by the 'version-manifest' software definition in omnibus-software.

Examples:

text_manifest_path

Returns:

  • (String)


725
726
727
728
729
730
731
# File 'lib/omnibus/project.rb', line 725

def text_manifest_path(path = NULL)
  if null?(path)
    @test_manifest_path || File.join(install_dir, "version-manifest.txt")
  else
    @text_manifest_path = path
  end
end

#write_json_manifestObject



1016
1017
1018
1019
1020
# File 'lib/omnibus/project.rb', line 1016

def write_json_manifest
  File.open(json_manifest_path, 'w') do |f|
    f.write(JSON.pretty_generate(built_manifest.to_hash))
  end
end

#write_text_manifestObject

Writes a text manifest to the text_manifest_path. This uses the same method as the “version-manifest” software definition in omnibus-software.



1027
1028
1029
1030
1031
1032
1033
# File 'lib/omnibus/project.rb', line 1027

def write_text_manifest
  File.open(text_manifest_path, 'w') do |f|
    f.puts "#{name} #{build_version}"
    f.puts ""
    f.puts Omnibus::Reports.pretty_version_map(self)
  end
end