class Rake::Funnel::Support::MSBuild::BuildTool
Constants
- KEY
- REGISTRY_VERSIONS
Public Class Methods
find()
click to toggle source
# File lib/rake/funnel/support/msbuild/build_tool.rb, line 11 def find vswhere || from_registry || mono || raise('No compatible MSBuild build tool was found') end
Private Class Methods
from_registry()
click to toggle source
# File lib/rake/funnel/support/msbuild/build_tool.rb, line 59 def from_registry return nil unless require_registry candidates = REGISTRY_VERSIONS.map do |version| version_key(version) do |reg| candidate = File.join(reg['MSBuildToolsPath'] || '', 'msbuild.exe') next candidate if File.exist?(candidate) end end candidates.compact.first end
mono()
click to toggle source
# File lib/rake/funnel/support/msbuild/build_tool.rb, line 20 def mono out, status = Open3.capture2('mono', '--version') unless status.success? $stderr.print "Could not determine mono version: #{status}\n" return nil end return 'msbuild' if out[/^Mono JIT compiler version ([\d\.]+)/, 1] >= '5.0' 'xbuild' rescue Errno::ENOENT nil end
require_registry()
click to toggle source
# File lib/rake/funnel/support/msbuild/build_tool.rb, line 72 def require_registry require 'win32/registry' true rescue LoadError false end
version_key(version) { |reg| ... }
click to toggle source
# File lib/rake/funnel/support/msbuild/build_tool.rb, line 79 def version_key(version) key = KEY + '\\' + version ::Win32::Registry::HKEY_LOCAL_MACHINE.open(key) do |reg| yield(reg) if block_given? end rescue ::Win32::Registry::Error nil end
vswhere()
click to toggle source
# File lib/rake/funnel/support/msbuild/build_tool.rb, line 34 def vswhere # rubocop:disable Metrics/MethodLength # -products * is required. # https://github.com/Microsoft/vswhere/issues/61#issuecomment-298691077 args = %w(vswhere.exe -products * -latest -requires Microsoft.Component.MSBuild -property installationPath) path, status = Open3.capture2(*args) unless status.success? $stderr.print "vswhere failed: #{status}\n" return nil end Dir[File.join(Rake::Win32.normalize(path.strip), 'MSBuild/*/Bin/MSBuild.exe')] .find { |e| File.file?(e) } rescue Errno::ENOENT nil end