physique 0.2.2 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/Gemfile.lock +14 -14
- data/lib/physique/dsl.rb +2 -32
- data/lib/physique/solution.rb +1 -1
- data/lib/physique/task_builders/build.rb +2 -2
- data/lib/physique/task_builders/fluent_migrator.rb +5 -5
- data/lib/physique/task_builders/nuget.rb +1 -1
- data/lib/physique/task_builders/octopus.rb +1 -1
- data/lib/physique/task_builders/publish_nugets.rb +48 -9
- data/lib/physique/task_builders/test.rb +1 -2
- data/lib/physique/tasks/octopus_pack.rb +1 -1
- data/lib/physique/tasks_builder.rb +1 -1
- data/lib/physique/tool_locator.rb +3 -3
- data/lib/physique/version.rb +1 -1
- data/spec/publish_nugets_spec.rb +40 -0
- data/spec/test_data/tool_locator/Program Files/Microsoft SQL Server/110/Tools/Binn/SQLCMD.exe.txt +1 -0
- data/spec/test_data/tool_locator/Windows/Microsoft.NET/Framework/v3.5/MSBuild.exe.txt +1 -0
- data/spec/test_data/tool_locator/Windows/Microsoft.NET/Framework/v4.0.30319/MSBuild.exe.txt +1 -0
- data/spec/tool_locator_spec.rb +11 -4
- metadata +11 -3
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
MTk4ZGQ1NDM0Mzc2MDY1MjljNjRhZTc5ZDg1ZjZmZjk3ZjU3MjQ1Ng==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ZTZhNGMyN2ZiMGNhMjZjYjM3MDIwZmRkMTc2NWQ0NGQ0NTY3YjVmZQ==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NjQzZmI2MTY2M2I1MDZmM2E5NWZkNTJlMTBlNzNlNTY1YzQyYTFhZWEwMDU3
|
10
|
+
YTgyMTA1Nzk5NWQ5ZWZlNzgxOWY4ODNlMDBmMzY4NjMyYTZlMjIxOWRkZjAx
|
11
|
+
M2NjODhhOTgzMGY3OWE0M2ZhOTIxMmI1Yjk5ZDQ1OWZkYmY3YTM=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
N2FkYTlmMThhNzEzNjhjNDA5ZGNkNTcxMTgxNTcxYmM4M2ViMDhlNWE0MTgy
|
14
|
+
NjYzZWU0YTYwYjY5NjExNWE4N2U1MmQ5ZmJmNDQyOTI0ZDEyZmZiMjI1OGE0
|
15
|
+
MGY3ODk4NDhmYzgxNjE4Njk4YzQ1N2EyMDk4OGIzM2Y3MDFlNWE=
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
physique (0.
|
4
|
+
physique (0.3.0)
|
5
5
|
activesupport (~> 4.1)
|
6
6
|
albacore (= 2.0.0.rc.12)
|
7
7
|
map (~> 6.5)
|
@@ -11,11 +11,11 @@ GEM
|
|
11
11
|
specs:
|
12
12
|
ProcessPilot (2.0.0.20120301)
|
13
13
|
rUtilAnts (>= 1.0)
|
14
|
-
activesupport (4.
|
15
|
-
i18n (~> 0.
|
14
|
+
activesupport (4.2.0)
|
15
|
+
i18n (~> 0.7)
|
16
16
|
json (~> 1.7, >= 1.7.7)
|
17
17
|
minitest (~> 5.1)
|
18
|
-
thread_safe (~> 0.
|
18
|
+
thread_safe (~> 0.3, >= 0.3.4)
|
19
19
|
tzinfo (~> 1.1)
|
20
20
|
albacore (2.0.0.rc.12)
|
21
21
|
ProcessPilot (~> 2.0)
|
@@ -28,15 +28,15 @@ GEM
|
|
28
28
|
diff-lcs (1.2.5)
|
29
29
|
facter (1.7.6)
|
30
30
|
highline (1.6.21)
|
31
|
-
i18n (0.
|
32
|
-
json (1.8.
|
33
|
-
map (6.5.
|
34
|
-
mini_portile (0.6.
|
35
|
-
minitest (5.
|
36
|
-
nokogiri (1.6.2
|
37
|
-
mini_portile (
|
31
|
+
i18n (0.7.0)
|
32
|
+
json (1.8.2)
|
33
|
+
map (6.5.5)
|
34
|
+
mini_portile (0.6.2)
|
35
|
+
minitest (5.5.1)
|
36
|
+
nokogiri (1.6.6.2-x86-mingw32)
|
37
|
+
mini_portile (~> 0.6.0)
|
38
38
|
rUtilAnts (2.0.0.20130827)
|
39
|
-
rake (10.
|
39
|
+
rake (10.4.2)
|
40
40
|
rspec (2.14.1)
|
41
41
|
rspec-core (~> 2.14.0)
|
42
42
|
rspec-expectations (~> 2.14.0)
|
@@ -45,9 +45,9 @@ GEM
|
|
45
45
|
rspec-expectations (2.14.5)
|
46
46
|
diff-lcs (>= 1.1.3, < 2.0)
|
47
47
|
rspec-mocks (2.14.6)
|
48
|
-
semver2 (3.
|
48
|
+
semver2 (3.4.1)
|
49
49
|
thread_safe (0.3.4)
|
50
|
-
tzinfo (1.2.
|
50
|
+
tzinfo (1.2.2)
|
51
51
|
thread_safe (~> 0.1)
|
52
52
|
|
53
53
|
PLATFORMS
|
data/lib/physique/dsl.rb
CHANGED
@@ -2,39 +2,9 @@ require 'albacore/dsl'
|
|
2
2
|
|
3
3
|
# Reopen Albacore DSL to get at the pre-built tasks
|
4
4
|
# There is probably a better way to do this but ```me == :ruby_noob```
|
5
|
-
module
|
5
|
+
module Physique
|
6
6
|
module DSL
|
7
|
-
|
8
|
-
asmver *args, &block
|
9
|
-
end
|
10
|
-
|
11
|
-
def build_task(*args, &block)
|
12
|
-
build *args, &block
|
13
|
-
end
|
14
|
-
|
15
|
-
def nugets_restore_task(*args, &block)
|
16
|
-
nugets_restore *args, &block
|
17
|
-
end
|
18
|
-
|
19
|
-
def test_runner_task(*args, &block)
|
20
|
-
test_runner *args, &block
|
21
|
-
end
|
22
|
-
|
23
|
-
def sqlcmd_task(*args, &block)
|
24
|
-
sqlcmd *args, &block
|
25
|
-
end
|
26
|
-
|
27
|
-
def fluent_migrator_task(*args, &block)
|
28
|
-
fluent_migrator *args, &block
|
29
|
-
end
|
30
|
-
|
31
|
-
def nugets_pack_task(*args, &block)
|
32
|
-
nugets_pack *args, &block
|
33
|
-
end
|
34
|
-
|
35
|
-
def octopus_pack_task(*args, &block)
|
36
|
-
octopus_pack *args, &block
|
37
|
-
end
|
7
|
+
include Albacore::DSL
|
38
8
|
|
39
9
|
private
|
40
10
|
|
data/lib/physique/solution.rb
CHANGED
@@ -41,12 +41,12 @@ module Physique
|
|
41
41
|
def add_compile_tasks
|
42
42
|
block = lambda &method(:configure_build)
|
43
43
|
|
44
|
-
task =
|
44
|
+
task = build :compile => [ :restore ], &block.curry.(%w(Clean Rebuild))
|
45
45
|
task.add_description 'Builds the solution'
|
46
46
|
|
47
47
|
namespace :compile do
|
48
48
|
solution.compile.targets.each do |t|
|
49
|
-
task =
|
49
|
+
task = build t.downcase, &block.curry.(t)
|
50
50
|
task.add_description "Builds the solution using the #{t} target"
|
51
51
|
end
|
52
52
|
end
|
@@ -53,7 +53,7 @@ module Physique
|
|
53
53
|
FileList["#{@options.scripts_dir}/*.sql"].each do |f|
|
54
54
|
namespace :db do
|
55
55
|
task_name = File.basename(f, '.*')
|
56
|
-
task =
|
56
|
+
task = sqlcmd task_name do |s|
|
57
57
|
s.file = f
|
58
58
|
s.server_name = @options.instance
|
59
59
|
s.set_variable 'DATABASE_NAME', @options.name
|
@@ -67,7 +67,7 @@ module Physique
|
|
67
67
|
default_tasks(@options.name).each do |task_name,sql|
|
68
68
|
unless Rake::Task.task_defined? "db:#{task_name.to_s}"
|
69
69
|
namespace :db do
|
70
|
-
task =
|
70
|
+
task = sqlcmd task_name do |s|
|
71
71
|
s.command = sql
|
72
72
|
s.server_name = @options.instance
|
73
73
|
s.set_variable 'DATABASE_NAME', @options.name
|
@@ -99,7 +99,7 @@ module Physique
|
|
99
99
|
require 'physique/tasks/fluent_migrator'
|
100
100
|
|
101
101
|
namespace :db do
|
102
|
-
|
102
|
+
build :compile_db do |b|
|
103
103
|
b.target = [ 'Build' ]
|
104
104
|
b.file = solution.migrator.project_file
|
105
105
|
b.prop 'Configuration', solution.compile.configuration
|
@@ -109,11 +109,11 @@ module Physique
|
|
109
109
|
block = lambda &method(:configure_migration)
|
110
110
|
|
111
111
|
# Migrate up
|
112
|
-
task =
|
112
|
+
task = fluent_migrator :migrate => [ :compile_db ], &block.curry.('migrate:up')
|
113
113
|
task.add_description 'Migrate database to the latest version'
|
114
114
|
|
115
115
|
# Migrate down
|
116
|
-
task =
|
116
|
+
task = fluent_migrator :rollback => [ :compile_db ], &block.curry.('rollback')
|
117
117
|
task.add_description 'Rollback the database to the previous version'
|
118
118
|
end
|
119
119
|
end
|
@@ -93,7 +93,7 @@ module Physique
|
|
93
93
|
@options.apps.each do |a|
|
94
94
|
namespace :octo do
|
95
95
|
namespace :package do
|
96
|
-
task =
|
96
|
+
task = octopus_pack a.name => [:versionizer, :test] do |o|
|
97
97
|
ensure_output_location solution.nuget.build_location
|
98
98
|
|
99
99
|
o.project_file = a.project_file
|
@@ -1,15 +1,17 @@
|
|
1
1
|
require 'physique/config'
|
2
|
+
require 'forwardable'
|
2
3
|
|
3
4
|
module Physique
|
4
5
|
class PublishNugetsConfig < MetadataConfig
|
6
|
+
extend Forwardable
|
7
|
+
|
5
8
|
attr_writer :project_files, # Project files to include
|
6
9
|
:exclude, # Project files to exclude
|
7
|
-
:local_path
|
8
|
-
:feed_url, # Nuget feed to publish packages
|
9
|
-
:api_key # Nuget API key
|
10
|
+
:local_path # Path to publish locally
|
10
11
|
|
11
12
|
def initialize
|
12
13
|
super
|
14
|
+
@feeds = []
|
13
15
|
@alias_tasks = true
|
14
16
|
end
|
15
17
|
|
@@ -18,10 +20,7 @@ module Physique
|
|
18
20
|
@alias_tasks = false
|
19
21
|
end
|
20
22
|
|
21
|
-
|
22
|
-
@gen_symbols = true
|
23
|
-
@symbols_feed_url = value
|
24
|
-
end
|
23
|
+
def_delegators :default_feed, :feed_url=, :symbols_feed_url=, :api_key=
|
25
24
|
|
26
25
|
def opts
|
27
26
|
Map.new(
|
@@ -32,7 +31,8 @@ module Physique
|
|
32
31
|
gen_symbols: @gen_symbols,
|
33
32
|
symbols_feed_url: @symbols_feed_url,
|
34
33
|
api_key: @api_key,
|
35
|
-
alias_tasks: @alias_tasks
|
34
|
+
alias_tasks: @alias_tasks,
|
35
|
+
feeds: @feeds.map { |f| f.opts }
|
36
36
|
).apply(
|
37
37
|
local_path: 'C:/Nuget.Local'
|
38
38
|
)
|
@@ -45,6 +45,45 @@ module Physique
|
|
45
45
|
def exclude_or_default
|
46
46
|
@exclude || /Tests/
|
47
47
|
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def default_feed
|
52
|
+
@default_feed || create_default_feed
|
53
|
+
end
|
54
|
+
|
55
|
+
def create_default_feed
|
56
|
+
PublishNugetsFeedConfig.new.tap do |feed|
|
57
|
+
feed.name = 'default'
|
58
|
+
@default_feed = feed
|
59
|
+
@feeds << feed
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
class PublishNugetsFeedConfig
|
65
|
+
attr_writer :name, # Name of the nuget feed
|
66
|
+
:feed_url, # Nuget feed to publish packages
|
67
|
+
:api_key # Nuget API key
|
68
|
+
|
69
|
+
# Nuget feed to publish symbol packages
|
70
|
+
def symbols_feed_url=(value)
|
71
|
+
@gen_symbols = true
|
72
|
+
@symbols_feed_url = value
|
73
|
+
end
|
74
|
+
|
75
|
+
def opts
|
76
|
+
raise ArgumentError, 'You must specify a name for all nuget feeds' if @name.blank?
|
77
|
+
raise ArgumentError, "You must specify a feed_url for feed #{name}" if @feed_url.blank?
|
78
|
+
|
79
|
+
Map.new(
|
80
|
+
name: @name,
|
81
|
+
feed_url: @feed_url,
|
82
|
+
gen_symbols: @gen_symbols,
|
83
|
+
symbols_feed_url: @symbols_feed_url,
|
84
|
+
api_key: @api_key
|
85
|
+
)
|
86
|
+
end
|
48
87
|
end
|
49
88
|
|
50
89
|
class PublishNugetsTasksBuilder < TasksBuilder
|
@@ -65,7 +104,7 @@ module Physique
|
|
65
104
|
|
66
105
|
def add_package_nugets_task
|
67
106
|
namespace :nuget do
|
68
|
-
task =
|
107
|
+
task = nugets_pack :package => [ :versionizer, :test ] do |p|
|
69
108
|
ensure_output_location solution.nuget.build_location
|
70
109
|
|
71
110
|
p.configuration = solution.compile.configuration
|
@@ -25,12 +25,11 @@ module Physique
|
|
25
25
|
configuration = solution.compile.configuration
|
26
26
|
package_dir = solution.nuget.restore_location
|
27
27
|
|
28
|
-
task =
|
28
|
+
task = test_runner :test => test_dependencies do |tests|
|
29
29
|
tests.files = FileList["**/*.Tests/bin/#{configuration}/*.Tests.dll"]
|
30
30
|
tests.exe = locate_tool("#{package_dir}/NUnit.Runners.*/tools/nunit-console.exe")
|
31
31
|
tests.parameters.add('/labels')
|
32
32
|
tests.parameters.add('/trace=Verbose')
|
33
|
-
tests.parameters.add('/exclude=PersistenceTest')
|
34
33
|
end
|
35
34
|
task.add_description 'Run unit tests'
|
36
35
|
end
|
@@ -80,7 +80,7 @@ module Physique
|
|
80
80
|
work_dir: cwd,
|
81
81
|
out: out
|
82
82
|
|
83
|
-
# Octopus packages don't
|
83
|
+
# Octopus packages don't conform to NuGet standards so
|
84
84
|
# disable package analysis to prevent unnecessary warnings.
|
85
85
|
cmd.disable_package_analysis
|
86
86
|
|
@@ -12,7 +12,7 @@ module Physique
|
|
12
12
|
# The tool sorts any matching executables in descending order to that the most recent version is returned. To
|
13
13
|
# change this behavior call the method with the reverse option.
|
14
14
|
#
|
15
|
-
# locate_tool 'C:/path/to/**/tool.exe',
|
15
|
+
# locate_tool 'C:/path/to/**/tool.exe', find_latest: false
|
16
16
|
#
|
17
17
|
# Throws a ToolNotFoundError if no tool could be found.
|
18
18
|
def locate_tool(paths, options = {})
|
@@ -24,9 +24,9 @@ module Physique
|
|
24
24
|
|
25
25
|
info { "Attempting to locate tool in the following paths #{paths}" }
|
26
26
|
opts = Map.options(options)
|
27
|
-
opts = opts.apply :
|
27
|
+
opts = opts.apply :find_latest => true
|
28
28
|
paths = paths.collect { |p| which(p) }.compact.sort
|
29
|
-
paths = paths.reverse if opts[:
|
29
|
+
paths = paths.reverse if opts[:find_latest]
|
30
30
|
tool = paths.first
|
31
31
|
|
32
32
|
raise ToolNotFoundError, "Could not find tool in the following paths: \n #{paths}" if tool.nil?
|
data/lib/physique/version.rb
CHANGED
@@ -0,0 +1,40 @@
|
|
1
|
+
FEED_URL = 'https://www.nuget.org'
|
2
|
+
SYMBOLS_FEED_URL = 'http://nuget.gw.symbolsource.org/Public/NuGet'
|
3
|
+
|
4
|
+
describe Physique::PublishNugetsConfig do
|
5
|
+
let(:config) { Physique::PublishNugetsConfig.new }
|
6
|
+
let(:opts) { config.opts }
|
7
|
+
|
8
|
+
describe 'when setting feed data directly' do
|
9
|
+
let(:first_feed) { opts.feeds[0] }
|
10
|
+
|
11
|
+
it 'should create a default feed and delegate its configuration' do
|
12
|
+
config.feed_url = FEED_URL
|
13
|
+
config.symbols_feed_url = SYMBOLS_FEED_URL
|
14
|
+
|
15
|
+
opts.feeds.count.should eq(1)
|
16
|
+
|
17
|
+
first_feed.name.should eq('default')
|
18
|
+
first_feed.feed_url.should eq(FEED_URL)
|
19
|
+
first_feed.symbols_feed_url.should eq(SYMBOLS_FEED_URL)
|
20
|
+
first_feed.gen_symbols.should be_true
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe Physique::PublishNugetsFeedConfig do
|
26
|
+
let(:config) { Physique::PublishNugetsFeedConfig.new }
|
27
|
+
let(:feed) { config.opts }
|
28
|
+
|
29
|
+
it 'should set opts values' do
|
30
|
+
config.name = 'default'
|
31
|
+
config.feed_url = FEED_URL
|
32
|
+
config.symbols_feed_url = SYMBOLS_FEED_URL
|
33
|
+
config.api_key = 'API_KEY'
|
34
|
+
|
35
|
+
feed.name.should eq('default')
|
36
|
+
feed.feed_url.should eq(FEED_URL)
|
37
|
+
feed.symbols_feed_url.should eq(SYMBOLS_FEED_URL)
|
38
|
+
feed.gen_symbols.should be_true
|
39
|
+
end
|
40
|
+
end
|
data/spec/test_data/tool_locator/Program Files/Microsoft SQL Server/110/Tools/Binn/SQLCMD.exe.txt
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
This is just a place holder to make tests pass.
|
@@ -0,0 +1 @@
|
|
1
|
+
This is just a place holder to make tests pass.
|
@@ -0,0 +1 @@
|
|
1
|
+
This is just a place holder to make tests pass.
|
data/spec/tool_locator_spec.rb
CHANGED
@@ -10,13 +10,20 @@ describe Physique::ToolLocator do
|
|
10
10
|
end
|
11
11
|
|
12
12
|
it 'should find tool based on file spec' do
|
13
|
-
result = locate_tool('
|
14
|
-
expect(result).to eq('
|
13
|
+
result = locate_tool('./spec/test_data/tool_locator/Program Files/Microsoft SQL Server/**/Tools/Binn/SQLCMD.exe.txt')
|
14
|
+
expect(result).to eq('./spec/test_data/tool_locator/Program Files/Microsoft SQL Server/110/Tools/Binn/SQLCMD.exe.txt')
|
15
15
|
end
|
16
16
|
|
17
|
-
|
18
|
-
|
17
|
+
MS_BUILD_PATH = './spec/test_data/tool_locator/Windows/Microsoft.NET/Framework/**/msbuild.exe.txt'
|
18
|
+
|
19
|
+
it 'should find latest version of a tool based on file spec' do
|
20
|
+
result = locate_tool(MS_BUILD_PATH)
|
19
21
|
expect(result).to match(%r{v4.0}i)
|
20
22
|
end
|
23
|
+
|
24
|
+
it 'should find first version of a tool if specified' do
|
25
|
+
result = locate_tool(MS_BUILD_PATH, find_latest: false)
|
26
|
+
expect(result).to match(%r{v3.5}i)
|
27
|
+
end
|
21
28
|
end
|
22
29
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: physique
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Scaduto
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-02-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -115,8 +115,12 @@ files:
|
|
115
115
|
- physique.gemspec
|
116
116
|
- spec/config_spec.rb
|
117
117
|
- spec/project_spec.rb
|
118
|
+
- spec/publish_nugets_spec.rb
|
118
119
|
- spec/solution_spec.rb
|
119
120
|
- spec/sqlcmd_spec.rb
|
121
|
+
- spec/test_data/tool_locator/Program Files/Microsoft SQL Server/110/Tools/Binn/SQLCMD.exe.txt
|
122
|
+
- spec/test_data/tool_locator/Windows/Microsoft.NET/Framework/v3.5/MSBuild.exe.txt
|
123
|
+
- spec/test_data/tool_locator/Windows/Microsoft.NET/Framework/v4.0.30319/MSBuild.exe.txt
|
120
124
|
- spec/tool_locator_spec.rb
|
121
125
|
homepage: http://github.com/scardetto/physique
|
122
126
|
licenses:
|
@@ -138,7 +142,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
138
142
|
version: '0'
|
139
143
|
requirements: []
|
140
144
|
rubyforge_project:
|
141
|
-
rubygems_version: 2.
|
145
|
+
rubygems_version: 2.3.0
|
142
146
|
signing_key:
|
143
147
|
specification_version: 4
|
144
148
|
summary: A conventional build framework supporting NUnit, FluentMigrator and Octopus
|
@@ -146,6 +150,10 @@ summary: A conventional build framework supporting NUnit, FluentMigrator and Oct
|
|
146
150
|
test_files:
|
147
151
|
- spec/config_spec.rb
|
148
152
|
- spec/project_spec.rb
|
153
|
+
- spec/publish_nugets_spec.rb
|
149
154
|
- spec/solution_spec.rb
|
150
155
|
- spec/sqlcmd_spec.rb
|
156
|
+
- spec/test_data/tool_locator/Program Files/Microsoft SQL Server/110/Tools/Binn/SQLCMD.exe.txt
|
157
|
+
- spec/test_data/tool_locator/Windows/Microsoft.NET/Framework/v3.5/MSBuild.exe.txt
|
158
|
+
- spec/test_data/tool_locator/Windows/Microsoft.NET/Framework/v4.0.30319/MSBuild.exe.txt
|
151
159
|
- spec/tool_locator_spec.rb
|