Class: Albacore::Project

Inherits:
Object
  • Object
show all
Includes:
Logging
Defined in:
lib/albacore/project.rb

Overview

a project encapsulates the properties from a xxproj file.

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Logging

#debug, #err, #error, #fatal, #info, #puts, #trace, #warn

Constructor Details

#initialize(proj_path) ⇒ Project

Returns a new instance of Project.

Raises:

  • (ArgumentError)


19
20
21
22
23
24
25
# File 'lib/albacore/project.rb', line 19

def initialize proj_path
  raise ArgumentError, 'project path does not exist' unless File.exists? proj_path.to_s
  proj_path = proj_path.to_s unless proj_path.is_a? String
  @proj_xml_node = Nokogiri.XML(open(proj_path))
  @proj_path_base, @proj_filename = File.split proj_path
  sanity_checks
end

Instance Attribute Details

#proj_filenameObject (readonly)

Returns the value of attribute proj_filename.



17
18
19
# File 'lib/albacore/project.rb', line 17

def proj_filename
  @proj_filename
end

#proj_path_baseObject (readonly)

Returns the value of attribute proj_path_base.



17
18
19
# File 'lib/albacore/project.rb', line 17

def proj_path_base
  @proj_path_base
end

#proj_xml_nodeObject (readonly)

Returns the value of attribute proj_xml_node.



17
18
19
# File 'lib/albacore/project.rb', line 17

def proj_xml_node
  @proj_xml_node
end

Instance Method Details

#asmnameObject

get the assembly name specified in the project file



53
54
55
# File 'lib/albacore/project.rb', line 53

def asmname
  read_property 'AssemblyName'
end

#authorsObject

gets any authors from the project file



68
69
70
# File 'lib/albacore/project.rb', line 68

def authors
  read_property 'Authors'
end

#declared_packagesObject



139
140
141
# File 'lib/albacore/project.rb', line 139

def declared_packages
  return nuget_packages || paket_packages || []
end

#declared_projectsObject



143
144
145
146
147
148
149
150
151
# File 'lib/albacore/project.rb', line 143

def declared_projects
  @proj_xml_node.css("ProjectReference").collect do |proj_ref|
    debug do
      ref_name = proj_ref.css("Name").inner_text
      "found project reference: #{name} => #{ref_name} [albacore: project]"
    end
    Project.new(File.join(@proj_path_base, Albacore::Paths.normalise_slashes(proj_ref['Include'])))
  end
end

#descriptionObject



72
73
74
# File 'lib/albacore/project.rb', line 72

def description
  read_property 'Description'
end

#fallback_output_pathObject

This is the output path if the project file doens’t have a configured ‘Configuration’ condition like all default project files have that come from Visual Studio/Xamarin Studio.



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

def fallback_output_path
  fallback = @proj_xml_node.css("Project PropertyGroup OutputPath").first
  condition = fallback.parent['Condition'] || 'No \'Condition\' specified'
  warn "chose an OutputPath in: '#{self}' for Configuration: <#{condition}> [albacore: project]"
  fallback.inner_text
end

#faulty_refsObject



119
120
121
# File 'lib/albacore/project.rb', line 119

def faulty_refs
  find_refs.to_a.keep_if{ |r| r.children.css("HintPath").empty? }
end

#find_packagesObject

Find all packages that have been declared and can be found in ./src/packages. This is mostly useful if you have that repository structure. returns enumerable Package



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

def find_packages
  declared_packages.collect do |package|
    guess = ::Albacore::PackageRepo.new(%w|./packages ./src/packages|).find_latest package.id
    debug "#{name}: guess: #{guess} [albacore: project]"
    guess
  end
end

#find_refsObject

find the NodeList reference list



114
115
116
117
# File 'lib/albacore/project.rb', line 114

def find_refs
  # should always be there
  @proj_xml_node.css("Project Reference")
end

#guidObject

Get the project GUID without ‘or ‘’ characters.



28
29
30
# File 'lib/albacore/project.rb', line 28

def guid
  guid_raw.gsub /[\{\}]/, ''
end

#guid_rawObject

Get the project GUID as it is in the project file.



33
34
35
# File 'lib/albacore/project.rb', line 33

def guid_raw
  read_property 'ProjectGuid'
end

#has_faulty_refs?Boolean



123
124
125
# File 'lib/albacore/project.rb', line 123

def has_faulty_refs?
  faulty_refs.any?
end

#has_packages_config?Boolean



127
128
129
# File 'lib/albacore/project.rb', line 127

def has_packages_config?
  File.exists? package_config
end

#has_paket_deps?Boolean



131
132
133
# File 'lib/albacore/project.rb', line 131

def has_paket_deps?
  File.exists? paket_deps
end

#has_paket_refs?Boolean



135
136
137
# File 'lib/albacore/project.rb', line 135

def has_paket_refs?
  File.exists? paket_refs
end

#idObject

Get the project id specified in the project file. Defaults to #name.



38
39
40
# File 'lib/albacore/project.rb', line 38

def id
  (read_property 'Id') || name
end

#included_filesObject

returns a list of the files included in the project



154
155
156
157
158
159
160
161
162
163
164
165
166
167
# File 'lib/albacore/project.rb', line 154

def included_files
  ['Compile','Content','EmbeddedResource','None'].map { |item_name|
    proj_xml_node.xpath("/x:Project/x:ItemGroup/x:#{item_name}",
      'x' => "http://schemas.microsoft.com/developer/msbuild/2003").collect { |f|
      debug "#{name}: #included_files looking at '#{f}' [albacore: project]"
      link = f.elements.select{ |el| el.name == 'Link' }.map { |el| el.content }.first
      OpenStruct.new(
        :item_name => item_name.downcase,
        :link      => link,
        :include   => f['Include']
      )
    }
  }.flatten
end

#licenseObject

the license that the project has defined in the metadata in the xxproj file.



77
78
79
# File 'lib/albacore/project.rb', line 77

def license
  read_property 'License'
end

#nameObject Also known as: title

Get the project name specified in the project file. This is the same as the title of the nuspec and, if Id is not specified, also the id of the nuspec.



45
46
47
# File 'lib/albacore/project.rb', line 45

def name
  (read_property 'Name') || asmname
end

#namespaceObject

Get the root namespace of the project



58
59
60
# File 'lib/albacore/project.rb', line 58

def namespace
  read_property 'RootNamespace'
end

#output_dll(conf) ⇒ Object

Gets the relative location (to the project base path) of the dll that it will output



109
110
111
# File 'lib/albacore/project.rb', line 109

def output_dll conf
  Paths.join(output_path(conf) || fallback_output_path, "#{asmname}.dll")
end

#output_path(conf) ⇒ Object

gets the output path of the project given the configuration or raise an error otherwise



83
84
85
# File 'lib/albacore/project.rb', line 83

def output_path conf
  try_output_path conf || raise(ConfigurationNotFoundError, "could not find configuration '#{conf}'")
end

#package_configObject

get the full path of ‘packages.config’



192
193
194
# File 'lib/albacore/project.rb', line 192

def package_config
  File.join @proj_path_base, 'packages.config'
end

#paket_depsObject

Get the full path of ‘paket.dependencies’



197
198
199
# File 'lib/albacore/project.rb', line 197

def paket_deps
  File.join @proj_path_base, 'paket.dependencies'
end

#paket_refsObject

Get the full path of ‘paket.references’



202
203
204
# File 'lib/albacore/project.rb', line 202

def paket_refs
  File.join @proj_path_base, 'paket.references'
end

#pathObject

get the path of the project file



181
182
183
# File 'lib/albacore/project.rb', line 181

def path
  File.join @proj_path_base, @proj_filename
end

#save(output = nil) ⇒ Object

save the xml



186
187
188
189
# File 'lib/albacore/project.rb', line 186

def save(output = nil)
  output = path unless output
  File.open(output, 'w') { |f| @proj_xml_node.write_xml_to f }
end

#to_sObject

Gets the path of the project file



207
208
209
# File 'lib/albacore/project.rb', line 207

def to_s
  path
end

#try_output_path(conf) ⇒ Object



87
88
89
90
91
92
93
94
95
# File 'lib/albacore/project.rb', line 87

def try_output_path conf
  path = @proj_xml_node.css("Project PropertyGroup[Condition*='#{conf}|'] OutputPath")
  # path = @proj_xml_node.xpath("//Project/PropertyGroup[matches(@Condition, '#{conf}')]/OutputPath")

  debug { "#{name}: output path node[#{conf}]: #{ (path.empty? ? 'empty' : path.inspect) } [albacore: project]" }

  return path.inner_text unless path.empty?
  nil
end

#versionObject

gets the version from the project file



63
64
65
# File 'lib/albacore/project.rb', line 63

def version
  read_property 'Version'
end