.net - que - Camino a MSBuild
msbuild que es (15)
¿Cómo puedo obtener programáticamente la ruta a MSBuild desde un equipo donde se ejecuta mi .exe?
Puedo obtener la versión .NET del entorno, pero ¿hay alguna manera de obtener la carpeta correcta para una versión .NET?
@AllenSanborn tiene una excelente versión de PowerShell, pero algunas personas tienen el requisito de utilizar solo scripts por lotes para compilaciones.
Esta es una versión aplicada de lo que respondió @ bono8106.
msbuildpath.bat
@echo off
reg.exe query "HKLM/SOFTWARE/Microsoft/MSBuild/ToolsVersions/14.0" /v MSBuildToolsPath > nul 2>&1
if ERRORLEVEL 1 goto MissingMSBuildRegistry
for /f "skip=2 tokens=2,*" %%A in (''reg.exe query "HKLM/SOFTWARE/Microsoft/MSBuild/ToolsVersions/14.0" /v MSBuildToolsPath'') do SET "MSBUILDDIR=%%B"
IF NOT EXIST "%MSBUILDDIR%" goto MissingMSBuildToolsPath
IF NOT EXIST "%MSBUILDDIR%msbuild.exe" goto MissingMSBuildExe
exit /b 0
goto:eof
::ERRORS
::---------------------
:MissingMSBuildRegistry
echo Cannot obtain path to MSBuild tools from registry
goto:eof
:MissingMSBuildToolsPath
echo The MSBuild tools path from the registry ''%MSBUILDDIR%'' does not exist
goto:eof
:MissingMSBuildExe
echo The MSBuild executable could not be found at ''%MSBUILDDIR%''
goto:eof
build.bat
@echo off
call msbuildpath.bat
"%MSBUILDDIR%msbuild.exe" foo.csproj /p:Configuration=Release
Para Visual Studio 2017 / MSBuild 15, Aziz Atif (el tipo que escribió Elmah ) escribió un script por lotes
build.cmd Release Foo.csproj
https://github.com/linqpadless/LinqPadless/blob/master/build.cmd
@echo off
setlocal
if "%PROCESSOR_ARCHITECTURE%"=="x86" set PROGRAMS=%ProgramFiles%
if defined ProgramFiles(x86) set PROGRAMS=%ProgramFiles(x86)%
for %%e in (Community Professional Enterprise) do (
if exist "%PROGRAMS%/Microsoft Visual Studio/2017/%%e/MSBuild/15.0/Bin/MSBuild.exe" (
set "MSBUILD=%PROGRAMS%/Microsoft Visual Studio/2017/%%e/MSBuild/15.0/Bin/MSBuild.exe"
)
)
if exist "%MSBUILD%" goto :restore
set MSBUILD=
for %%i in (MSBuild.exe) do set MSBUILD=%%~dpnx$PATH:i
if not defined MSBUILD goto :nomsbuild
set MSBUILD_VERSION_MAJOR=
set MSBUILD_VERSION_MINOR=
for /f "delims=. tokens=1,2,3,4" %%m in (''msbuild /version /nologo'') do (
set MSBUILD_VERSION_MAJOR=%%m
set MSBUILD_VERSION_MINOR=%%n
)
if not defined MSBUILD_VERSION_MAJOR goto :nomsbuild
if not defined MSBUILD_VERSION_MINOR goto :nomsbuild
if %MSBUILD_VERSION_MAJOR% lss 15 goto :nomsbuild
if %MSBUILD_VERSION_MINOR% lss 1 goto :nomsbuild
:restore
for %%i in (NuGet.exe) do set nuget=%%~dpnx$PATH:i
if "%nuget%"=="" (
echo WARNING! NuGet executable not found in PATH so build may fail!
echo For more on NuGet, see https://github.com/nuget/home
)
pushd "%~dp0"
nuget restore ^
&& call :build Debug %* ^
&& call :build Release %*
popd
goto :EOF
:build
setlocal
"%MSBUILD%" /p:Configuration=%1 /v:m %2 %3 %4 %5 %6 %7 %8 %9
goto :EOF
:nomsbuild
echo Microsoft Build version 15.1 (or later) does not appear to be
echo installed on this machine, which is required to build the solution.
exit /b 1
Comenzando con MSBuild 2017 (v15), MSBuild ahora está instalado en una carpeta debajo de cada versión de Visual Studio, y ya no está configurado en el registro
Estos son algunos ejemplos de dónde se encuentra MSBuild.exe en mi máquina:
C:/windows/Microsoft.NET/Framework/v2.0.50727/MSBuild.exe (v2.0.50727.8745 32-bit)
C:/windows/Microsoft.NET/Framework64/v2.0.50727/MSBuild.exe (v2.0.50727.8745 64-bit)
C:/Windows/Microsoft.NET/Framework/v3.5/MSBuild.exe (v3.5.30729.8763 32-bit)
C:/Windows/Microsoft.NET/Framework64/v3.5/MSBuild.exe (v3.5.30729.8763 64-bit)
C:/Windows/Microsoft.NET/Framework/v4.0.30319/MSBuild.exe (v4.7.2053.0 32-bit)
C:/Windows/Microsoft.NET/Framework64/v4.0.30319/MSBuild.exe (v4.7.2053.0 64-bit)
C:/Program Files (x86)/MSBuild/12.0/Bin/MSBuild.exe (v12.0.21005.1 32-bit)
C:/Program Files (x86)/MSBuild/12.0/Bin/amd64/MSBuild.exe (v12.0.21005.1 64-bit)
C:/Program Files (x86)/MSBuild/14.0/Bin/MSBuild.exe (v14.0.25420.1 32-bit)
C:/Program Files (x86)/MSBuild/14.0/Bin/amd64/MSBuild.exe (v14.0.25420.1 64-bit)
C:/Program Files (x86)/Microsoft Visual Studio/2017/BuildTools/MSBuild/15.0/Bin/MSBuild.exe (v15.1.1012+g251a9aec17 32-bit)
C:/Program Files (x86)/Microsoft Visual Studio/2017/BuildTools/MSBuild/15.0/Bin/amd64/MSBuild.exe (v15.1.1012+g251a9aec17 64-bit)
C:/Program Files (x86)/Microsoft Visual Studio/2017/{LicenceName}/MSBuild/Bin/MSBuild.exe (v15.1.1012.6693 32-bit)
C:/Program Files (x86)/Microsoft Visual Studio/2017/{LicenceName}/MSBuild/Bin/amd64/MSBuild.exe (v15.1.1012.6693 64-bit)
Con Visual Studio 2017, Microsoft cambió nuevamente la ubicación de MSBuild. Esta vez fue tan difícil localizarlo que creó una herramienta ad-hoc para esta tarea:
Parece que esta será la forma "correcta" de descubrir MSBuild, al menos para VS2017
En Windows 2003 y posterior, escriba este comando en cmd:
cmd> where MSBuild
Sample result: C:/Windows/Microsoft.NET/Framework/v4.0.30319/MSBuild.exe
Si no aparece nada, significa que .NET Framework no está incluido en el sistema PATH. El MSBuild debe estar en la carpeta de instalación .NET, junto con los compiladores .NET (vbc.exe, csc.exe)
Esto funciona para Visual Studio 2015 y 2017:
function Get-MSBuild-Path {
$vs14key = "HKLM:/SOFTWARE/Microsoft/MSBuild/ToolsVersions/14.0"
$vs15key = "HKLM:/SOFTWARE/wow6432node/Microsoft/VisualStudio/SxS/VS7"
$msbuildPath = ""
if (Test-Path $vs14key) {
$key = Get-ItemProperty $vs14key
$subkey = $key.MSBuildToolsPath
if ($subkey) {
$msbuildPath = Join-Path $subkey "msbuild.exe"
}
}
if (Test-Path $vs15key) {
$key = Get-ItemProperty $vs15key
$subkey = $key."15.0"
if ($subkey) {
$msbuildPath = Join-Path $subkey "MSBuild/15.0/bin/amd64/msbuild.exe"
}
}
return $msbuildPath
}
Hurgando en el registro, parece
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/MSBuild/ToolsVersions/2.0
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/MSBuild/ToolsVersions/3.5
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/MSBuild/ToolsVersions/4.0
puede ser lo que buscas; encienda regedit.exe y eche un vistazo.
Las ubicaciones de registro
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/MSBuild/ToolsVersions/2.0
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/MSBuild/ToolsVersions/3.5
dar la ubicación para el ejecutable.
Pero si necesita la ubicación donde guardar las extensiones de la Tarea, está en
%ProgramFiles%/MSBuild
Para recuperar la ruta de msbuild 15 (Visual Studio 2017) con lotes del registro sin herramientas adicionales:
set regKey=HKLM/SOFTWARE/WOW6432Node/Microsoft/VisualStudio/SxS/VS7
set regValue=15.0
for /f "skip=2 tokens=3,*" %%A in (''reg.exe query %regKey% /v %regValue% 2^>nul'') do (
set vs17path=%%A %%B
)
set msbuild15path = %vs17path%/MSBuild/15.0/Bin/MSBuild.exe
Mejores herramientas disponibles:
- vswhere : vswhere Visual Studio 2017 y las instalaciones más nuevas, consulte github.com/Microsoft/vswhere/wiki/Find-MSBuild (utiliza la ruta codificada como mi fragmento de código anterior).
- github.com/Microsoft/vssetup.powershell utilizando Microsoft.VisualStudio.Workload.MSBuildTools
Para scripts de shell cmd en Windows 7, utilizo el siguiente fragmento en mi archivo por lotes para encontrar MSBuild.exe en .NET Framework versión 4. Supongo que la versión 4 está presente, pero no asumo la subversión. Esto no es totalmente de propósito general, pero para los scripts rápidos puede ser útil:
set msbuild.exe=
for /D %%D in (%SYSTEMROOT%/Microsoft.NET/Framework/v4*) do set msbuild.exe=%%D/MSBuild.exe
Para mis usos, estoy saliendo del archivo por lotes con un error si eso no funcionó:
if not defined msbuild.exe echo error: can''t find MSBuild.exe & goto :eof
if not exist "%msbuild.exe%" echo error: %msbuild.exe%: not found & goto :eof
Puede obtener la versión .NET y obtener una versión específica:
HKEY_LOCAL_MACHINE / SOFTWARE / Microsoft / MSBuild / ToolsVersions
Es la ubicación del registro
Puede utilizar este mismo comando de prueba de PowerShell para obtener MSBuildToolsPath
del registro.
PowerShell (del registro)
Resolve-Path HKLM:/SOFTWARE/Microsoft/MSBuild/ToolsVersions/* |
Get-ItemProperty -Name MSBuildToolsPath
Salida
MSBuildToolsPath : C:/Program Files (x86)/MSBuild/12.0/bin/amd64/
PSPath : Microsoft.PowerShell.Core/Registry::HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/MSBuild/ToolsVersions/12.0
PSParentPath : Microsoft.PowerShell.Core/Registry::HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/MSBuild/ToolsVersions
PSChildName : 12.0
PSDrive : HKLM
PSProvider : Microsoft.PowerShell.Core/Registry
MSBuildToolsPath : C:/Program Files (x86)/MSBuild/14.0/bin/amd64/
PSPath : Microsoft.PowerShell.Core/Registry::HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/MSBuild/ToolsVersions/14.0
PSParentPath : Microsoft.PowerShell.Core/Registry::HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/MSBuild/ToolsVersions
PSChildName : 14.0
PSDrive : HKLM
PSProvider : Microsoft.PowerShell.Core/Registry
MSBuildToolsPath : C:/Windows/Microsoft.NET/Framework64/v2.0.50727/
PSPath : Microsoft.PowerShell.Core/Registry::HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/MSBuild/ToolsVersions/2.0
PSParentPath : Microsoft.PowerShell.Core/Registry::HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/MSBuild/ToolsVersions
PSChildName : 2.0
PSDrive : HKLM
PSProvider : Microsoft.PowerShell.Core/Registry
MSBuildToolsPath : C:/Windows/Microsoft.NET/Framework64/v3.5/
PSPath : Microsoft.PowerShell.Core/Registry::HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/MSBuild/ToolsVersions/3.5
PSParentPath : Microsoft.PowerShell.Core/Registry::HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/MSBuild/ToolsVersions
PSChildName : 3.5
PSDrive : HKLM
PSProvider : Microsoft.PowerShell.Core/Registry
MSBuildToolsPath : C:/Windows/Microsoft.NET/Framework64/v4.0.30319/
PSPath : Microsoft.PowerShell.Core/Registry::HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/MSBuild/ToolsVersions/4.0
PSParentPath : Microsoft.PowerShell.Core/Registry::HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/MSBuild/ToolsVersions
PSChildName : 4.0
PSDrive : HKLM
PSProvider : Microsoft.PowerShell.Core/Registry
o desde el sistema de archivos
PowerShell (del sistema de archivos)
Resolve-Path "C:/Program Files (x86)/MSBuild/*/Bin/amd64/MSBuild.exe"
Resolve-Path "C:/Program Files (x86)/MSBuild/*/Bin/MSBuild.exe"
Salida
Path
----
C:/Program Files (x86)/MSBuild/12.0/Bin/amd64/MSBuild.exe
C:/Program Files (x86)/MSBuild/14.0/Bin/amd64/MSBuild.exe
C:/Program Files (x86)/MSBuild/12.0/Bin/MSBuild.exe
C:/Program Files (x86)/MSBuild/14.0/Bin/MSBuild.exe
Si desea compilar un proyecto Delphi, consulte "ERROR MSB4040 No hay un objetivo en el proyecto" cuando se usa msbuild + Delphi2009
Se dice la respuesta correcta: "Hay un archivo por lotes llamado rsvars.bat ( búscalo en la carpeta RAD Studio). Llama antes de llamar a MSBuild y configurará las variables de entorno necesarias. Asegúrate de que las carpetas estén correctas en rsvars. .bat si tiene el compilador en una ubicación diferente a la predeterminada ".
Este bate no solo actualizará la variable de entorno PATH a la carpeta .NET adecuada con la versión adecuada de MSBuild.exe, sino que también registrará otras variables necesarias.
Si desea utilizar MSBuild para .Net 4, puede usar el siguiente comando de PowerShell para obtener la ruta del ejecutable. Si desea la versión 2.0 o 3.5, simplemente cambie la variable $ dotNetVersion.
Para ejecutar el ejecutable, deberá anteponer la variable $ msbuild con &. Eso ejecutará la variable.
# valid versions are [2.0, 3.5, 4.0]
$dotNetVersion = "4.0"
$regKey = "HKLM:/software/Microsoft/MSBuild/ToolsVersions/$dotNetVersion"
$regProperty = "MSBuildToolsPath"
$msbuildExe = join-path -path (Get-ItemProperty $regKey).$regProperty -childpath "msbuild.exe"
&$msbuildExe
También puede imprimir la ruta de MSBuild.exe a la línea de comando:
reg.exe query "HKLM/SOFTWARE/Microsoft/MSBuild/ToolsVersions/4.0" /v MSBuildToolsPath
la manera más fácil podría ser abrir PowerShell e ingresar
dir HKLM:/SOFTWARE/Microsoft/MSBuild/ToolsVersions/