albacore 2.8.0 → 3.0.0.pre.alpha

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.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/lib/albacore/cli.rb +2 -2
  3. data/lib/albacore/dsl.rb +2 -42
  4. data/lib/albacore/nuget_model.rb +173 -67
  5. data/lib/albacore/paket.rb +20 -5
  6. data/lib/albacore/paths.rb +1 -0
  7. data/lib/albacore/project.rb +228 -45
  8. data/lib/albacore/task_types/nugets_pack.rb +73 -425
  9. data/lib/albacore/task_types/sql_cmd.rb +1 -1
  10. data/lib/albacore/tasks/release.rb +2 -2
  11. data/lib/albacore/version.rb +1 -1
  12. data/spec/dsl_spec.rb +1 -1
  13. data/spec/nuget_model_spec.rb +208 -79
  14. data/spec/nugets_pack_spec.rb +1 -353
  15. data/spec/paket_spec.rb +51 -2
  16. data/spec/project_spec.rb +118 -43
  17. data/spec/shared_contexts.rb +28 -14
  18. data/spec/testdata/Project/Project.fsproj +1 -1
  19. data/spec/testdata/console-core-argu/.gitignore +4 -0
  20. data/spec/testdata/console-core-argu/.paket/Paket.Restore.targets +239 -0
  21. data/spec/testdata/console-core-argu/.paket/paket.exe +0 -0
  22. data/spec/testdata/console-core-argu/.paket/paket.targets +72 -0
  23. data/spec/testdata/console-core-argu/ConsoleArgu.fsproj +12 -0
  24. data/spec/testdata/console-core-argu/Library.fs +31 -0
  25. data/spec/testdata/console-core-argu/build.sh +4 -0
  26. data/spec/testdata/console-core-argu/paket.dependencies +3 -0
  27. data/spec/testdata/console-core-argu/paket.lock +565 -0
  28. data/spec/testdata/console-core-argu/paket.references +2 -0
  29. data/spec/testdata/console-core-argu/paket.template +1 -0
  30. metadata +26 -16
  31. data/lib/albacore/app_spec.rb +0 -229
  32. data/lib/albacore/cpack_app_spec.rb +0 -135
  33. data/lib/albacore/task_types/nugets.rb +0 -8
  34. data/lib/albacore/task_types/nugets_restore.rb +0 -181
  35. data/spec/app_spec_spec.rb +0 -147
  36. data/spec/fpm_app_spec_spec.rb +0 -157
  37. data/spec/nugets_find_gem_exe_spec.rb +0 -21
  38. data/spec/nugets_restore_spec.rb +0 -77
@@ -93,6 +93,7 @@ module Paths
93
93
  def extname
94
94
  @inner.extname
95
95
  end
96
+
96
97
  def ==(o)
97
98
  trace { "#{self} ==( #{o} )" }
98
99
  (o.respond_to? :p) && o.p == p
@@ -4,24 +4,93 @@ require 'albacore/semver'
4
4
  require 'albacore/package_repo'
5
5
  require 'albacore/paket'
6
6
  require 'pathname'
7
- module Albacore
8
7
 
8
+ module Albacore
9
9
  # error raised from Project#output_path if the given configuration wasn't
10
10
  # found
11
11
  class ConfigurationNotFoundError < ::StandardError
12
12
  end
13
13
 
14
- # a project encapsulates the properties from a xxproj file.
14
+ class OutputArtifact
15
+ EXECUTABLE = :executable
16
+ LIBRARY = :dll
17
+ XMLDOC = :xmldoc
18
+ SYMBOLS = :symbols
19
+
20
+ # E.g. "bin/Debug/lib.dll"
21
+ # E.g. "bin/Debug/net461/lib.dll"
22
+ # E.g. "bin/Debug/net461/lib.xml"
23
+ # E.g. "bin/Debug/net461/lib.dll.pdb"
24
+ # E.g. "bin/Debug/net461/prog.exe"
25
+ attr_reader :path
26
+
27
+ # E.g. "lib.dll"
28
+ # E.g. "prog.exe"
29
+ attr_reader :filename
30
+
31
+ # E.g. :dll
32
+ attr_reader :sort
33
+
34
+ # E.g. ".txt"
35
+ attr_reader :ext
36
+
37
+ # Create a new OutputArtifact
38
+ def initialize path, sort
39
+ @path, @sort = path, sort
40
+ @ext = File.extname path
41
+ @filename = File.basename path
42
+ end
43
+
44
+ # Is the file a DLL file?
45
+ def library?
46
+ sort == ::LIBRARY
47
+ end
48
+
49
+ # Is the file a DLL file?
50
+ def dll?
51
+ library?
52
+ end
53
+
54
+ # Is the file an executable?
55
+ def executable?
56
+ sort == ::EXECUTABLE
57
+ end
58
+
59
+ # Is the file a documentation file?
60
+ def xmldoc?
61
+ sort == ::XMLDOC
62
+ end
63
+
64
+ # Is the file a symbol file?
65
+ def symbols?
66
+ sort == ::SYMBOLS
67
+ end
68
+
69
+ def ==(o)
70
+ @path == o.path && @sort == o.sort
71
+ end
72
+
73
+ alias_method :eql?, :==
74
+ end
75
+
76
+ # A project encapsulates the properties from a xxproj file.
15
77
  class Project
16
78
  include Logging
17
79
 
18
- attr_reader :proj_path_base, :proj_filename, :proj_xml_node
80
+ attr_reader \
81
+ :proj_path_base,
82
+ :proj_filename,
83
+ :ext,
84
+ :proj_filename_noext,
85
+ :proj_xml_node
19
86
 
20
87
  def initialize proj_path
21
88
  raise ArgumentError, 'project path does not exist' unless File.exists? proj_path.to_s
22
89
  proj_path = proj_path.to_s unless proj_path.is_a? String
23
90
  @proj_xml_node = Nokogiri.XML(open(proj_path))
24
91
  @proj_path_base, @proj_filename = File.split proj_path
92
+ @ext = File.extname @proj_filename
93
+ @proj_filename_noext = File.basename @proj_filename, ext
25
94
  sanity_checks
26
95
  end
27
96
 
@@ -44,15 +113,20 @@ module Albacore
44
113
  # the title of the nuspec and, if Id is not specified, also the id of the
45
114
  # nuspec.
46
115
  def name
47
- (read_property 'Name') || asmname
116
+ read_property('Name') || asmname || proj_filename_noext
48
117
  end
49
118
 
50
119
  # The same as #name
51
120
  alias_method :title, :name
52
121
 
122
+ # The project is a .Net Core project.
123
+ def netcore?
124
+ ! @proj_xml_node.css('Project').attr('Sdk').nil?
125
+ end
126
+
53
127
  # get the assembly name specified in the project file
54
128
  def asmname
55
- read_property 'AssemblyName'
129
+ read_property('AssemblyName') || proj_filename_noext
56
130
  end
57
131
 
58
132
  # Get the root namespace of the project
@@ -79,42 +153,131 @@ module Albacore
79
153
  read_property 'License'
80
154
  end
81
155
 
82
- # the target .NET Framework / .NET Standard version
83
- def target_framework
84
- read_property 'TargetFrameworkVersion'
156
+ def xmldoc? conf='Debug', platform='AnyCPU'
157
+ if netcore?
158
+ gdf = read_property('GenerateDocumentationFile')
159
+ !gdf.nil? && gdf == 'true'
160
+ else
161
+ ! read_property('DocumentationFile', conf, platform).nil?
162
+ end
85
163
  end
86
-
87
- # gets the output path of the project given the configuration or raise
88
- # an error otherwise
89
- def output_path conf
90
- try_output_path conf || raise(ConfigurationNotFoundError, "could not find configuration '#{conf}'")
164
+
165
+ def symbols? conf='Debug', platform='AnyCPU'
166
+ read_property('DebugSymbols', conf) == 'true'
91
167
  end
92
168
 
93
- def try_output_path conf
94
- default_platform = @proj_xml_node.css('Project PropertyGroup Platform').first.inner_text || 'AnyCPU'
95
- path = @proj_xml_node.css("Project PropertyGroup[Condition*='#{conf}|#{default_platform}'] OutputPath")
96
- # path = @proj_xml_node.xpath("//Project/PropertyGroup[matches(@Condition, '#{conf}')]/OutputPath")
169
+ # OutputArtifact::LIBRARY
170
+ # OutputArtifact::EXECUTABLE
171
+ def output_type
172
+ ot = read_property 'OutputType'
173
+ case ot
174
+ when 'Library'
175
+ OutputArtifact::LIBRARY
176
+ when 'Exe'
177
+ OutputArtifact::EXECUTABLE
178
+ else
179
+ ot
180
+ end
181
+ end
97
182
 
98
- debug { "#{name}: output path node[#{conf}]: #{ (path.empty? ? 'empty' : path.inspect) } [albacore: project]" }
183
+ # ".exe"?, ".dll"?
184
+ def output_file_ext
185
+ case output_type
186
+ when OutputArtifact::LIBRARY
187
+ ".dll"
188
+ when OutputArtifact::EXECUTABLE
189
+ ".exe"
190
+ end
191
+ end
192
+
193
+ def default_platform
194
+ @proj_xml_node.css('Project PropertyGroup Platform').first.inner_text || 'AnyCPU'
195
+ end
196
+
197
+ def debug_type conf
198
+ dt = read_property "DebugType", conf
199
+ end
200
+
201
+ # the target .NET Framework / .NET version
202
+ def target_framework
203
+ read = read_property('TargetFrameworkVersion')
204
+ case read
205
+ when 'v3.5'
206
+ 'net35'
207
+ when 'v3.5.1'
208
+ 'net351'
209
+ when 'v4.0'
210
+ 'net40'
211
+ when 'v4.5'
212
+ 'net45'
213
+ when 'v4.5.1'
214
+ 'net451'
215
+ when 'v4.6'
216
+ 'net46'
217
+ when 'v4.6.1'
218
+ 'net461'
219
+ when 'v4.6.2'
220
+ 'net462'
221
+ when 'v5.0'
222
+ 'net50'
223
+ when 'v5.0.1'
224
+ 'net501'
225
+ else
226
+ read
227
+ end
228
+ end
99
229
 
100
- return path.inner_text unless path.empty?
101
- nil
230
+ # Gets the target frameworks as specified by .Net Core syntax
231
+ def target_frameworks
232
+ if netcore?
233
+ tfw = @proj_xml_node.css('Project PropertyGroup TargetFramework').inner_text
234
+ tfws = @proj_xml_node.css('Project PropertyGroup TargetFrameworks').inner_text
235
+ nfws = if tfw.nil? || tfw == '' then tfws else tfw end
236
+ fws = nfws.split(';')
237
+ else
238
+ [ target_framework ]
239
+ end
240
+ end
241
+
242
+ # Returns OutputArtifact[] or throws an error
243
+ def outputs conf, fw
244
+ os = try_outputs(conf, fw)
245
+ if os.empty?
246
+ raise(ConfigurationNotFoundError, "could not find configuration '#{conf}'")
247
+ else
248
+ os
249
+ end
102
250
  end
103
251
 
104
- # This is the output path if the project file doesn't have a configured
105
- # 'Configuration' condition like all default project files have that come
106
- # from Visual Studio/Xamarin Studio.
107
- def fallback_output_path
108
- fallback = @proj_xml_node.css("Project PropertyGroup OutputPath").first
109
- condition = fallback.parent['Condition'] || 'No \'Condition\' specified'
110
- warn "chose an OutputPath in: '#{self}' for Configuration: <#{condition}> [albacore: project]"
111
- fallback.inner_text
252
+ def try_outputs conf, fw
253
+ outputs = []
254
+ if netcore? then
255
+ outputs << OutputArtifact.new("bin/#{conf}/#{fw}/#{asmname}#{output_file_ext}", output_type)
256
+ outputs << OutputArtifact.new("bin/#{conf}/#{fw}/#{asmname}.xml", OutputArtifact::XMLDOC) if xmldoc?
257
+ else
258
+ path = read_property 'OutputPath', conf, default_platform
259
+ if path != ''
260
+ full_path = Albacore::Paths.join(path, "#{asmname}#{output_file_ext}").to_s
261
+ outputs << OutputArtifact.new(full_path, output_type)
262
+ end
263
+
264
+ if xmldoc? conf, default_platform
265
+ xml_full_path = read_property 'DocumentationFile', conf
266
+ outputs << OutputArtifact.new(xml_full_path, OutputArtifact::XMLDOC)
267
+ end
268
+
269
+ if symbols? conf, default_platform
270
+ pdb_full_path = Albacore::Paths.join(path, "#{asmname}.pdb").to_s
271
+ outputs << OutputArtifact.new(pdb_full_path, OutputArtifact::SYMBOLS)
272
+ end
273
+ end
274
+ outputs
112
275
  end
113
276
 
114
277
  # Gets the relative location (to the project base path) of the dll
115
278
  # that it will output
116
- def output_dll conf
117
- Paths.join(output_path(conf) || fallback_output_path, "#{asmname}.dll")
279
+ def output_dll conf, fw
280
+ output_paths(conf, fw).keep_if { |o| o.library? }.first
118
281
  end
119
282
 
120
283
  # find the NodeList reference list
@@ -227,8 +390,6 @@ module Albacore
227
390
  p
228
391
  end
229
392
 
230
-
231
-
232
393
  # Reads assembly version information
233
394
  # Returns 1.0.0.0 if AssemblyVersion is not found
234
395
  # @return string
@@ -242,11 +403,11 @@ module Albacore
242
403
  rescue
243
404
  '1.0.0.0'
244
405
  end
245
-
246
406
  end
247
407
 
248
408
 
249
- private
409
+ private
410
+
250
411
  def nuget_packages
251
412
  return nil unless has_packages_config?
252
413
  doc = Nokogiri.XML(open(package_config))
@@ -262,9 +423,27 @@ module Albacore
262
423
 
263
424
  def all_paket_deps
264
425
  return @all_paket_deps if @all_paket_deps
265
- arr = File.open('paket.lock', 'r') do |io|
266
- Albacore::Paket.parse_paket_lock(io.readlines.map(&:chomp))
426
+
427
+ path = if File.exists?('paket.lock') then
428
+ 'paket.lock'
429
+ else
430
+ File.join(@proj_path_base, "paket.lock")
431
+ end
432
+
433
+ arr = File.open(path, 'r') do |io|
434
+ lines = io.readlines.map(&:chomp)
435
+ Albacore::Paket.parse_paket_lock(lines)
436
+ .map { |depid, dep|
437
+ [ depid,
438
+ target_frameworks.map { |fw|
439
+ dep2 = OpenStruct.new dep
440
+ dep2[:target_framework] = fw
441
+ dep2
442
+ }
443
+ ]
444
+ }
267
445
  end
446
+
268
447
  @all_paket_deps = Hash[arr]
269
448
  end
270
449
 
@@ -275,7 +454,8 @@ module Albacore
275
454
 
276
455
  if has_paket_refs?
277
456
  File.open paket_refs, 'r' do |io|
278
- io.readlines.map(&:chomp).compact.each do |line|
457
+ lines = io.readlines.map(&:chomp)
458
+ lines.compact.each do |line|
279
459
  paket_package_by_id! line, all_refs, 'referenced'
280
460
  end
281
461
  end
@@ -283,20 +463,21 @@ module Albacore
283
463
 
284
464
  if has_paket_deps?
285
465
  File.open paket_deps, 'r' do |io|
286
- io.readlines.map(&:chomp).compact.each do |line|
466
+ lines = io.readlines.map(&:chomp)
467
+ Albacore::Paket.parse_dependencies_file(lines).each do |line|
287
468
  paket_package_by_id! line, all_refs, 'dependent'
288
469
  end
289
470
  end
290
471
  end
291
472
 
292
- all_refs
473
+ all_refs.uniq
293
474
  end
294
475
 
295
476
  def paket_package_by_id! id, arr, ref_type
296
- pkg = all_paket_deps[id]
297
- if pkg
477
+ pkgs = all_paket_deps[id]
478
+ if ! pkgs.nil? && pkgs.length > 0
298
479
  debug { "found #{ref_type} package '#{id}' [project: paket_packages]" }
299
- arr << pkg
480
+ arr.concat(pkgs)
300
481
  else
301
482
  warn { "found #{ref_type} package '#{id}' not in paket.lock [project: paket_packages]" }
302
483
  end
@@ -306,9 +487,11 @@ module Albacore
306
487
  warn { "project '#{@proj_filename}' has no name" } unless name
307
488
  end
308
489
 
309
- def read_property prop_name
310
- txt = @proj_xml_node.css("Project PropertyGroup #{prop_name}").inner_text
311
- txt.length == 0 ? nil : txt.strip
490
+ def read_property prop_name, conf='Debug', platform='AnyCPU'
491
+ specific = @proj_xml_node.css("Project PropertyGroup[Condition*='#{conf}|#{platform}'] #{prop_name}")
492
+ chosen = if specific.empty? then @proj_xml_node.css("Project PropertyGroup #{prop_name}") else specific end
493
+ first = chosen.first
494
+ if first.nil? then nil else first.inner_text end
312
495
  end
313
496
 
314
497
  # find the node of pkg_id
@@ -1,478 +1,126 @@
1
1
  require 'rake'
2
- require 'nokogiri'
3
- require 'fileutils'
4
- require 'pathname'
5
2
  require 'albacore'
6
- require 'albacore/paths'
3
+ require 'albacore/package'
7
4
  require 'albacore/cmd_config'
8
5
  require 'albacore/config_dsl'
9
6
  require 'albacore/cross_platform_cmd'
10
7
  require 'albacore/project'
11
8
  require 'albacore/logging'
12
9
  require 'albacore/nuget_model'
13
- require 'albacore/task_types/nugets'
14
10
 
15
11
  module Albacore
16
12
  module NugetsPack
17
- # the nuget command
18
- class Cmd
19
- include CrossPlatformCmd
20
-
21
- # executable => the nuget executable
22
- def initialize executable, *args
23
- opts = Map.options args
24
- raise ArgumentError, 'out is nil' if opts.getopt(:out).nil?
25
-
26
- @work_dir = opts.getopt :work_dir, default: nil
27
- @executable = executable
28
- @parameters = [%W{Pack -OutputDirectory #{opts.get(:out)}}].flatten
29
- @opts = opts
30
-
31
- mono_command unless opts.get(:mono_opt_out)
32
- end
33
-
34
- # run nuget on the nuspec to create a new package
35
- # returns: a tuple-array of the package and the symbol package
36
- # of which the symbol package is nil if it was not generated
37
- def execute nuspec_file, nuspec_symbols_file = nil
38
- debug "NugetsPack::Cmd#execute, opts: #{@opts} [nugets pack: cmd]"
39
- original_pars = @parameters.dup
40
-
41
- pars = original_pars.dup
42
- pars << nuspec_file
43
- pars << '-NoPackageAnalysis' unless @opts.get :package_analysis
44
- pkg = get_nuget_path_of do
45
- system @executable, pars, :work_dir => @work_dir
46
- end
47
-
48
- debug "package at '#{pkg}'"
49
-
50
- # if the symbols flag is set and there's a symbols file specified
51
- # then run NuGet.exe to generate the .symbols.nupkg file
52
- if nuspec_symbols_file
53
- pars = original_pars.dup
54
- pars << '-Symbols'
55
- pars << nuspec_symbols_file
56
- spkg = with_subterfuge pkg do
57
- get_nuget_path_of do
58
- system @executable, pars, :work_dir => @work_dir
59
- end
60
- end
61
-
62
- debug "symbol package at '#{spkg}'"
63
-
64
- [pkg, spkg]
65
- else
66
- info "symbols not configured for generation, use Config#gen_symbols to do so [nugets pack: cmd]"
67
- [pkg, nil]
68
- end
69
- end
70
-
71
- private
72
-
73
- # regexpes the package path from the output
74
- def get_nuget_path_of
75
- out = yield
76
- out.match(/Successfully created package '([:\s\p{Word}\\\/\d\.\-]+\.symbols\.nupkg)'./iu) if out.respond_to? :match
77
- trace "Got symbols return value: '#{out}', matched: '#{$1}'" if $1
78
- return $1 if $1
79
-
80
- out.match(/Successfully created package '([:\s\p{Word}\\\/\d\.\-]+\.nupkg)'./iu)if out.respond_to? :match
81
- trace "Got NOT-symbols return value: '#{out}', matched: '#{$1}'"
82
-
83
- unless $1
84
- args = ARGV.inject("") { |state, arg| state + " " + '"' + arg + '"' }
85
- warn do
86
- %{Couldn't match package, please run
87
- bundle exec rake DEBUG=true #{args} --trace
88
- and report a bug to albacore with the full output. Here's the nuget process output:
89
- --- START OUTPUT ---
90
- #{out}
91
- --- END OUTPUT ---
92
- }
93
- end
94
- end
95
-
96
- $1
97
- end
98
-
99
- # hide the original like a ninja while NuGet whimpers in a corner
100
- def with_subterfuge pkg
101
- FileUtils.mv pkg, "#{pkg}.tmp" if pkg && File.exists?(pkg)
102
- res = yield
103
- FileUtils.mv "#{pkg}.tmp", pkg if pkg && File.exists?("#{pkg}.tmp")
104
- res
105
- end
106
- end
107
13
 
108
- # This tasktype allows you to quickly package project files to nuget
109
- # packages.
110
- #
111
- # Point files to the project files, that should be in MsBuild XML.
112
- #
113
- # Examples
114
- #
115
- # nugets_pack :pack => ['build/pkg', :versioning] do |p|
116
- # p.files = FileList['src/**/*.csproj']
117
- # p.out = 'build/pkg'
118
- # p.exe = 'buildsupport/NuGet.exe'
119
- # p.with_metadata do |m|
120
- # m.version = ENV['NUGET_VERSION']
121
- # end
122
- # p.gen_symbols
123
- # p.no_project_dependencies
124
- # end
125
14
  class Config
126
15
  include CmdConfig
127
- self.extend ConfigDSL
128
-
129
- # the output directory to place the newfangled nugets in
130
- attr_path :out
131
-
132
- # the .net target (e.g. net40, mono20, mono3, etc)
133
- attr_writer :target
134
-
135
- # sets the files to search
136
- attr_writer :files
137
-
138
- # sets the nuspec file
139
- attr_writer :nuspec
140
-
141
-
142
- # sets the MsBuild configuration that is used to produce the output into
143
- # <OutputPath>...</OutputPath>
144
- attr_writer :configuration
145
16
 
146
17
  def initialize
147
- @package = Albacore::NugetModel::Package.new
148
- @target = ''
149
- @symbols = false
150
- @project_dependencies = true
151
- @nuget_dependencies = true
152
- @package_analysis = true
153
- @leave_nuspec = false
154
- @mono_opt_out = false
155
- fill_required
156
- end
157
-
158
- def mono_opt_out
159
- @mono_opt_out = true
18
+ @symbols = true
19
+ @transitive = true
20
+ @pin = false
21
+ @exe = '.paket/paket.exe'
22
+ @files = []
23
+ @metadata = Albacore::NugetModel::Metadata.new
160
24
  end
161
25
 
162
- def with_metadata &block
163
- yield @package.metadata
164
- end
26
+ attr_accessor :configuration
27
+ attr_accessor :exe
28
+ attr_accessor :output
29
+ attr_accessor :files
30
+ attr_accessor :metadata
165
31
 
166
- # configure the package with a block
167
- def with_package &block
168
- yield @package
32
+ def not_symbols
33
+ @symbols = false
169
34
  end
170
35
 
171
- # generate symbols for the nugets: just call this method to
172
- # enable generation
173
- def gen_symbols
174
- @symbols = true
36
+ def symbols?
37
+ @symbols
175
38
  end
176
39
 
177
- # leave the nuspec behind, don't delete it after generating it
178
- #
179
- def leave_nuspec
180
- @leave_nuspec = true
40
+ def not_transitive
41
+ @transitive = false
181
42
  end
182
43
 
183
- # call this if you want to cancel 'smart' scanning of the *proj
184
- # file for its dependencies
185
- def no_project_dependencies
186
- @project_dependencies = false
44
+ def transitive?
45
+ @transitive
187
46
  end
188
47
 
189
- # call this if you want to cancel inclusion of package dependencies
190
- # when creating the nuspec file
191
- def no_nuget_dependencies
192
- @nuget_dependencies = false
48
+ def pin
49
+ @pin = true
193
50
  end
194
51
 
195
- # call this if you want to disable NuGet's package analysis
196
- # when creating the nupkg file
197
- def no_package_analysis
198
- @package_analysis = false
52
+ def pin?
53
+ @pin
199
54
  end
200
55
 
201
- def nuget_gem_exe
202
- @exe = Albacore::Nugets::find_nuget_gem_exe
56
+ def method_missing(m, *args, &block)
57
+ @metadata.send(m, *args, &block)
203
58
  end
204
59
 
205
- # gets the options specified for the task, used from the task
206
- def opts
207
- files = @files.respond_to?(:each) ? @files : [@files]
208
-
209
- unless @nuspec
210
- [:authors, :description, :version].each do |required|
211
- warn "metadata##{required} is missing from nugets_pack [nugets pack: config]" if @package.metadata.send(required) == 'MISSING'
212
- end
60
+ def validate
61
+ if configuration.nil?
62
+ raise '"configuration" is a required property'
213
63
  end
214
-
215
- Map.new({
216
- :out => @out,
217
- :nuspec => @nuspec,
218
- :exe => @exe,
219
- :symbols => @symbols,
220
- :package => @package,
221
- :target => @target,
222
- :files => files,
223
- :configuration => @configuration,
224
- :project_dependencies => @project_dependencies,
225
- :nuget_dependencies => @nuget_dependencies,
226
- :package_analysis => @package_analysis,
227
- :mono_opt_out => @mono_opt_out,
228
- :original_path => FileUtils.pwd,
229
- :leave_nuspec => @leave_nuspec
230
- })
231
- end
232
-
233
- private
234
-
235
- def fill_required
236
- # see http://docs.nuget.org/docs/reference/nuspec-reference
237
- with_metadata do |m|
238
- m.authors = m.description = m.version = 'MISSING'
64
+ if version.nil?
65
+ raise '"version" is a required property'
239
66
  end
240
67
  end
241
68
  end
242
69
 
243
- # a task that handles the generation of nugets from projects or nuspecs.
244
- class ProjectTask
245
- include Logging
246
-
247
- def initialize opts, &before_execute
248
-
249
- unless opts.get(:nuspec)
250
- raise ArgumentError, 'opts is not a map' unless opts.is_a? Map
251
- raise ArgumentError, 'no files given' unless opts.get(:files).length > 0
252
- end
70
+ class Cmd
71
+ include CrossPlatformCmd
253
72
 
254
- @opts = opts.apply :out => '.'
255
- @files = opts.get :files
256
- @before_execute = before_execute
73
+ def initialize config
74
+ @executable = config.exe
75
+ @config = config
257
76
  end
258
77
 
259
78
  def execute
260
- unless @opts.get(:nuspec)
261
- knowns = compute_knowns
262
- @files.each do |p|
263
- proj, n, ns = generate_nuspec p, knowns
264
- execute_inner! proj, n, ns
265
- end
266
- else
267
- create_nuget! "#{Dir.pwd}", @opts.get(:nuspec)
268
- end
269
- end
270
-
271
- def path_to path, cwd
272
- if (Pathname.new path).absolute?
273
- return path
274
- else
275
- return File.expand_path( File.join(@opts.get(:original_path), path), cwd )
276
- end
277
- end
278
-
279
- # generate all nuspecs
280
- def generate_nuspecs
281
- nuspecs = {}
282
- knowns = compute_knowns
283
- @files.each do |p|
284
- proj, n, ns = generate_nuspec p, knowns
285
- nuspecs[proj.name] = OpenStruct.new({:proj => proj, :nuspec => n, :nuspec_symbols => ns })
79
+ @config.validate
80
+ invocations(@config).each do |parameters|
81
+ system @executable, parameters, clr_command: true
286
82
  end
287
- nuspecs
288
83
  end
289
84
 
290
- private
291
-
292
- # Computes the known *Ids* of the projects; as Name = Title when creating nugets.
293
- def compute_knowns
294
- Set.new(@files.map { |f| Albacore::Project.new f }.map { |p| p.id })
295
- end
296
-
297
- def generate_nuspec p, knowns
298
- proj = Albacore::Project.new p
299
- nuspec, nuspec_symbols = create_nuspec proj, knowns
300
- [proj, nuspec, nuspec_symbols]
301
- end
302
-
303
- # execute, for each project file
304
- def execute_inner! proj, nuspec, nuspec_symbols
305
- nuspec_path = write_nuspec! proj, nuspec, false
306
- nuspec_symbols_path = write_nuspec! proj, nuspec_symbols, true if nuspec_symbols
307
-
308
- create_nuget! proj.proj_path_base, nuspec_path, nuspec_symbols_path
309
- rescue => e
310
- err (e.inspect)
311
- raise $!
312
- ensure
313
- trace do
314
- %{
315
- PROJECT #{proj.name} nuspec:
316
- #{nuspec.to_xml}
317
- PROJECT #{proj.name} symbol nuspec:
318
- #{if nuspec_symbols then nuspec_symbols.to_xml else 'NO SYMBOLS' end}}
319
- end
320
-
321
- # now remove them all
322
- [nuspec_path, nuspec_symbols_path].each{|n| cleanup_nuspec n}
323
- end
324
-
325
- ## Creating
326
-
327
- def create_nuspec proj, knowns
328
- version = @opts.get(:package).metadata.version
329
- framework_dependencies = @opts.get(:package).metadata.framework_assemblies
330
- project_dependencies = @opts.get(:project_dependencies, true)
331
- nuget_dependencies = @opts.get(:nuget_dependencies, true)
332
- target = if '' == @opts.get(:target) then proj.target_framework else @opts.get :target end
333
- if target.start_with? 'v'
334
- target = "net#{target[1..target.size].gsub('.', '')}"
335
- end
336
-
337
- trace "creating NON-SYMBOL package for '#{proj.name}', targeting '#{target}' [nugets pack: task]"
338
- nuspec = Albacore::NugetModel::Package.from_xxproj proj,
339
- symbols: false,
340
- verify_files: true,
341
- dotnet_version: target,
342
- known_projects: knowns,
343
- version: version,
344
- configuration: (@opts.get(:configuration)),
345
- project_dependencies: project_dependencies,
346
- nuget_dependencies: nuget_dependencies,
347
- framework_dependencies: framework_dependencies
348
-
349
- # take data from package as configured in Rakefile, choosing what is in
350
- # Rakefile over what is in projfile.
351
- nuspec = nuspec.merge_with @opts.get(:package)
352
- trace { "nuspec: #{nuspec.to_s} [nugets pack: task]" }
353
-
354
- if @opts.get(:symbols)
355
- trace { "creating SYMBOL package for '#{proj.name}' [nugets pack: task]" }
356
- nuspec_symbols = Albacore::NugetModel::Package.from_xxproj proj,
357
- symbols: true,
358
- verify_files: true,
359
- dotnet_version: target,
360
- known_projects: knowns,
361
- version: version,
362
- configuration: (@opts.get(:configuration)),
363
- project_dependencies: project_dependencies,
364
- nuget_dependencies: nuget_dependencies,
365
- framework_dependencies: framework_dependencies
366
-
367
- nuspec_symbols = nuspec_symbols.merge_with @opts.get(:package)
368
- trace { "nuspec symbols: #{nuspec_symbols.to_s} [nugets pack: task]" }
369
-
370
- [nuspec, nuspec_symbols]
85
+ private
86
+ def defaults config
87
+ parameters = []
88
+ parameters = %w|pack|
89
+ parameters << config.output unless config.output.nil?
90
+ parameters << '--version' unless config.version.nil?
91
+ parameters << config.version unless config.version.nil?
92
+ parameters << '--build-config'
93
+ parameters << config.configuration
94
+ parameters << '--include-referenced-projects' if config.transitive?
95
+ parameters << '--symbols' if config.symbols?
96
+ parameters << '--project-url' if config.project_url
97
+ parameters << config.project_url if config.project_url
98
+ parameters
99
+ end
100
+
101
+ def invocations config
102
+ if config.files.empty?
103
+ [ defaults(config) ]
371
104
  else
372
- trace { "skipping SYMBOL package for #{proj.name} [nugets pack: task]" }
373
- [nuspec, nil]
374
- end
375
- end
376
-
377
- def write_nuspec! proj, nuspec, symbols
378
- raise ArgumentError, "no nuspect metadata id, project at path: #{proj.proj_path_base}, nuspec: #{nuspec.inspect}" unless nuspec.metadata.id
379
- nuspec_path = File.join(proj.proj_path_base, nuspec.metadata.id + "#{ symbols ? '.symbols' : '' }.nuspec")
380
-
381
- File.write(nuspec_path, nuspec.to_xml)
382
-
383
- nuspec_path
384
- end
105
+ config.files.map do |file|
106
+ proj = Albacore::Project.new file
107
+ package = Albacore::NugetModel::Package.from_xxproj proj,
108
+ configuration: config.configuration,
109
+ metadata: config.metadata
385
110
 
386
- def create_nuget! cwd, nuspec, nuspec_symbols = nil
387
- # create the command
388
- exe = path_to(@opts.get(:exe), cwd)
389
- out = path_to(@opts.get(:out), cwd)
390
- nuspec = path_to nuspec, cwd
391
- nuspec_symbols = path_to nuspec_symbols, cwd if nuspec_symbols
111
+ path = File.join(proj.proj_path_base, "paket.template")
392
112
 
393
- cmd = Albacore::NugetsPack::Cmd.new exe,
394
- work_dir: cwd,
395
- out: out,
396
- package_analysis: @opts.get(:package_analysis),
397
- mono_opt_out: @opts.get(:mono_opt_out)
398
-
399
-
400
- # run any concerns that modify the command
401
- @before_execute.call cmd if @before_execute
402
-
403
- debug { "generating nuspec at #{nuspec}, and symbols (possibly) at '#{nuspec_symbols}' [nugets pack: task]" }
404
-
405
- # run the command for the file
406
- pkg, spkg = cmd.execute nuspec, nuspec_symbols
407
-
408
- publish_artifact nuspec, pkg
409
- publish_artifact nuspec_symbols, spkg if spkg && nuspec_symbols
410
- end
411
-
412
- ## Cleaning up after generation
413
-
414
- def cleanup_nuspec nuspec
415
- return if nuspec.nil? or not File.exists? nuspec
416
- return if @opts.get :leave_nuspec, false
417
- File.delete nuspec
418
- end
419
-
420
- def publish_artifact nuspec, nuget
421
- Albacore.publish :artifact, OpenStruct.new(
422
- :nuspec => nuspec,
423
- :nupkg => nuget,
424
- :location => nuget
425
- )
426
- end
427
-
428
- def self.accept? f
429
- File.extname(f).downcase != '.nuspec'
430
- end
431
- end
432
-
433
- # generate a nuget from a nuspec
434
- class NuspecTask
435
- include Logging
436
-
437
- def initialize command_line, config, nuspec
438
- @config = config
439
- @nuspec = nuspec
440
- # is a NuspecPack::Cmd
441
- @command_line = command_line
442
- end
113
+ File.open(path, 'w') do |template|
114
+ template.write package.to_template
115
+ end
443
116
 
444
- def read_version_from_nuspec
445
- begin
446
- nuspec_file = File.open(@nuspec)
447
- xml = Nokogiri::XML(nuspec_file)
448
- nuspec_file.close
449
- nodes = xml.xpath('.//metadata/version')
450
- raise "No <version/> found" if nodes.empty?
451
- nodes.first.text()
452
- rescue => error
453
- err "Error reading package version from file: #{error}"
454
- raise
117
+ parameters = defaults config
118
+ parameters << '--template'
119
+ parameters << path
120
+ [ parameters ]
121
+ end
455
122
  end
456
123
  end
457
-
458
- def execute
459
- version = read_version_from_nuspec
460
- filename = File.basename(@nuspec, File.extname(@nuspec))
461
-
462
- @command_line.execute @nuspec
463
-
464
- path = File.join(@config.opts.get(:out), "#{filename}.#{version}.nupkg")
465
-
466
- Albacore.publish :artifact, OpenStruct.new(
467
- :nuspec => @nuspec,
468
- :nupkg => path,
469
- :location => path
470
- )
471
- end
472
-
473
- def self.accept? file
474
- File.extname(file).downcase == '.nuspec'
475
- end
476
124
  end
477
125
  end
478
- end
126
+ end