Class: MSBuild

Inherits:
Hash
  • Object
show all
Defined in:
lib/apps/msbuild.rb

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Hash

#execute, #to_html

Constructor Details

#initializeMSBuild

@@ignore_configurations=Array.new



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/apps/msbuild.rb', line 16

def initialize
  add(:vs9, "C:/Windows/Microsoft.NET/Framework/v3.5/msbuild.exe")
  add(:vs10, "C:/Windows/Microsoft.NET/Framework/v4.0.30319/msbuild.exe")
  add(:vs12, "C:/Program Files (x86)/MSBuild/12.0/bin/msbuild.exe")
  add(:vs14, "C:/Program Files (x86)/MSBuild/14.0/bin/msbuild.exe")
  add(:vs15, "C:/Program Files (x86)/MSBuild/15.0/bin/msbuild.exe")
  add(:vs15, "C:/Program Files (x86)/Microsoft Visual Studio/2017/Enterprise/MSBuild/15.0/Bin/MSBuild.exe")
  if File.exist?("C:/Program Files (x86)/Microsoft Visual Studio/2017/Professional/MSBuild/15.0/Bin/MSBuild.exe")
    add(:vs15, "C:/Program Files (x86)/Microsoft Visual Studio/2017/Professional/MSBuild/15.0/Bin/MSBuild.exe")
  end
  if File.exist?("C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/MSBuild/Current/Bin/MSBuild.exe")
    add(:vs16, "C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/MSBuild/Current/Bin/MSBuild.exe")
  end
  if File.exist?("C:/Program Files (x86)/Microsoft Visual Studio/2019/Preview/MSBuild/Current/Bin/MSBuild.exe")
    add(:vs16, "C:/Program Files (x86)/Microsoft Visual Studio/2019/Preview/MSBuild/Current/Bin/MSBuild.exe")
  end
  if File.exist?("C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/MSBuild/Current/Bin/MSBuild.exe")
    add(:vs16, "C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/MSBuild/Current/Bin/MSBuild.exe")
  end
  if File.exist?("C:/Program Files (x86)/Microsoft Visual Studio/2019/Professional/MSBuild/Current/Bin/MSBuild.exe")
    add(:vs16, "C:/Program Files (x86)/Microsoft Visual Studio/2019/Professional/MSBuild/Current/Bin/MSBuild.exe")
  end
end

Class Method Details

.get_build_commands(sln_filename) ⇒ Object



118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# File 'lib/apps/msbuild.rb', line 118

def self.get_build_commands(sln_filename)
  build_commands = nil
  vs_version = MSBuild.get_vs_version(sln_filename)
  puts "vs version for '#{sln_filename}' : #{vs_version}"
  if MSBuild.has_version?(vs_version)
    MSBuild.get_configurations(sln_filename).each do |configuration|
      MSBuild.get_platforms(sln_filename).each do |platform|
        build_commands = [] if build_commands.nil?
        msbuild_arg = MSBuild.get_version(vs_version)
        msbuild_arg = "\"#{MSBuild.get_version(vs_version)}\"" if msbuild_arg.include?(" ")
        sln_arg = sln_filename
        sln_arg = "\"#{sln_filename}\"" if sln_filename.include?(" ")
        platform_arg = "/p:Platform=#{platform}"
        platform_arg = "/p:Platform=\"#{platform}\"" if platform.include?(" ")
        build_commands << "#{msbuild_arg} #{sln_arg} /p:Configuration=#{configuration} #{platform_arg}"
      end
    end
  end
  build_commands
end

.get_configurations(sln_filename) ⇒ Object



95
96
97
98
99
100
101
102
103
104
105
# File 'lib/apps/msbuild.rb', line 95

def self.get_configurations(sln_filename)
  configs = []
  sln_text = File.read(sln_filename, encoding: "UTF-8")
  sln_text.scan(/= (\w+)\|/).each do |m|
    c = m.first.to_s
    ignore = false
    ignore = true if defined?(IGNORE_CONFIGURATIONS) && IGNORE_CONFIGURATIONS.include?(c)
    configs << c if !ignore && !configs.include?(c)
  end
  configs
end

.get_platforms(sln_filename) ⇒ Object



107
108
109
110
111
112
113
114
115
116
# File 'lib/apps/msbuild.rb', line 107

def self.get_platforms(sln_filename)
  platforms = []
  sln_text = File.read(sln_filename, encoding: "UTF-8")
  # sln_text.scan( /= [\w]+\|([\w ]+)/ ).each{|m|
  sln_text.scan(/\|([\w\d\s]+)\s*=/).each do |m|
    p = m.first.to_s.strip
    platforms << p unless platforms.include?(p)
  end
  platforms
end

.get_version(version) ⇒ Object



63
64
65
66
67
68
69
70
71
72
# File 'lib/apps/msbuild.rb', line 63

def self.get_version(version)
  return "msbuild" if MSBuild.in_path?

  if defined?(MSBUILD)
    MSBUILD[version]
  else
    msb = MSBuild.new
    msb[version]
  end
end

.get_vs_version(sln_filename) ⇒ Object



74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/apps/msbuild.rb', line 74

def self.get_vs_version(sln_filename)
  if sln_filename.nil?
    return :vs16 if has_version? :vs16
    return :vs15 if has_version? :vs15

    return :vs14
  end
  sln_text = File.read(sln_filename, encoding: "UTF-8")
  return :vs16 if sln_text.include?("Visual Studio Version 16")
  return :vs15 if sln_text.include?("VisualStudioVersion = 15.")
  return :vs9 if sln_text.include?("Format Version 10.00")
  return :vs12 if sln_text.include?("12.0.30723.0")
  return :vs12 if sln_text.include?("Visual Studio 2013")
  return :vs12 if sln_text.include?("12.0.31101.0")
  return :vs14 if sln_text.include?("VisualStudioVersion = 14.0.")
  return :vs16 if has_version? :vs16
  return :vs15 if has_version? :vs15

  :vs14
end

.has_version?(version) ⇒ Boolean

Returns:

  • (Boolean)


44
45
46
47
48
49
50
51
# File 'lib/apps/msbuild.rb', line 44

def self.has_version?(version)
  if defined?(MSBUILD)
    MSBUILD.key?(version)
  else
    msb = MSBuild.new
    msb.key? version
  end
end

.in_path?Boolean

Returns:

  • (Boolean)


53
54
55
56
57
58
59
60
61
# File 'lib/apps/msbuild.rb', line 53

def self.in_path?
  command = Command.new("msbuild /version")
  command[:quiet] = true
  command[:ignore_failure] = true
  command.execute
  return true if (command[:exit_code]).zero?

  false
end

Instance Method Details

#add(key, name) ⇒ Object



40
41
42
# File 'lib/apps/msbuild.rb', line 40

def add(key, name)
  self[key] = name if File.exist?(name)
end