พา ธ ไปยัง MSBuild


186

ฉันจะหาพา ธ ไปยัง MSBuild โดยใช้โปรแกรมจาก. exe ของฉันได้อย่างไร

ฉันสามารถรับรุ่น. NET จากสภาพแวดล้อม แต่มีวิธีรับโฟลเดอร์ที่ถูกต้องสำหรับรุ่น. NET หรือไม่

คำตอบ:


141

โผล่ไปรอบ ๆ รีจิสทรีดูเหมือนว่า

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

อาจเป็นสิ่งที่คุณหลังจาก; ไฟขึ้น regedit.exe และดู

ค้นหาผ่านบรรทัดคำสั่ง (ต่อNikolay Botev )

reg.exe query "HKLM\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0" /v MSBuildToolsPath

คำค้นหาผ่าน PowerShell (ต่อMovGP0 )

dir HKLM:\SOFTWARE\Microsoft\MSBuild\ToolsVersions\

5
ฉันได้ติดตั้ง Visual Studio 2017 RC และเริ่มต้นพรอมต์คำสั่งสำหรับนักพัฒนารุ่น MSBuild คือ 15+ แต่รุ่นนี้ไม่แสดงในรีจิสทรี ฉันจะเข้าถึง MSBuild เดียวกันกับที่ Dev Cmd Prompt ใช้งานได้อย่างไร
SuperJMN

6
MSBuild 15 ตั้งอยู่ที่ `C: \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ Enterprise \ MSBuild \ 15.0 \ Bin \ amd64`
nZeus

2
เฉพาะในกรณีที่คุณติดตั้ง VS2017 ที่นั่นฉันไม่พบจุดเข้าใช้งานเดียวในรีจิสทรีสำหรับ MsBuildToolsPath สำหรับชุดเครื่องมือ 15.0
Paciv

8
docs.microsoft.com/en-us/visualstudio/msbuild/… "MSBuild ได้รับการติดตั้งในโฟลเดอร์ภายใต้ Visual Studio แต่ละเวอร์ชันแล้วตัวอย่างเช่น C: \ Program Files (x86) Studio Visual 2017 \ Enterprise \ Enterprise MSBuild "และ" ToolsVersion ไม่มีการตั้งค่าในรีจิสทรีอีกต่อไป "
Hulvej

2
@ORMapper Microsoft เสนอโครงการบน GitHubเพื่อกำหนดพา ธ ของอินสแตนซ์Visual Studio 2017 / msbuild 15.x มันเป็นปฏิบัติการเดี่ยวที่สามารถใช้งานได้โดยซอฟต์แวร์สร้าง / สคริปต์ของคุณ
ร้อย Danton

140

คุณยังสามารถพิมพ์พา ธ ของ MSBuild.exe ไปที่บรรทัดคำสั่ง:

reg.exe query "HKLM\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0" /v MSBuildToolsPath

1
โปรดทราบว่าหากคุณต้องการสร้างแอพพลิเคชั่น windows phone นั่นจำเป็นต้องใช้ 32 บิต msbuild การค้นหารีจิสตรีจะให้เพียง 64 บิต msbuild บนเครื่อง 64 บิต
Victor Ionescu

2
@VictorIonescu: คุณสามารถใช้/reg:32หรือ/reg:64บนทั้งสองพี่น้องของcmd(หรือกระบวนการใด ๆ ที่คุณกำลังเรียกใช้) เพื่อรับเส้นทางนั้นอย่างชัดเจน
Simon Buchan

สิ่งนี้จะทำให้คุณมีเส้นทางไปยังตำแหน่ง (4.0) เก่า - อันที่คุณอาจต้องการคือที่อื่น ๆ ดูstackoverflow.com/questions/32007871//
JonnyRaa

ในกรณีของฉันมันอยู่ภายใต้Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\MSBuild\ToolsVersions\4.0\MSBuildToolsPath
Sen Jacob

32

หากคุณต้องการใช้ MSBuild สำหรับ. Net 4 คุณสามารถใช้คำสั่ง PowerShell ต่อไปนี้เพื่อรับพา ธ ของไฟล์เรียกทำงาน หากคุณต้องการรุ่น 2.0 หรือ 3.5 ให้เปลี่ยนตัวแปร $ dotNetVersion

ในการเรียกใช้โปรแกรมปฏิบัติการคุณจะต้องเพิ่มตัวแปร $ msbuild ด้วย & ที่จะรันตัวแปร

# 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

2
ใช้งานได้กับ$dotNetVersion12.0 (เทียบกับ 2013) และ 14.0 (เทียบกับ 2015) (หากติดตั้งแน่นอน)
Julian

4
ไม่ทำงานสำหรับ VS 2017 ซึ่งไม่ได้เพิ่มค่าภายใต้HKLM:\software\Microsoft\MSBuild\ToolsVersionsคีย์ แต่คุณต้องได้รับการติดตั้ง dir VS2017 จาก HKLM:\SOFTWARE\WOW6432Node\Microsoft\VisualStud‌​io\SxS\VS7\15.0นั้นผนวกMSBuild\15.0\Bin\MSBuild.exeเพื่อรับตำแหน่ง MSBuild EXE
Ian Kemp

30

สำหรับ cmd shell scripting ใน Windows 7 ฉันใช้แฟรกเมนต์ต่อไปนี้ในแบตช์ไฟล์ของฉันเพื่อค้นหา MSBuild.exe ใน. NET Framework เวอร์ชัน 4 ฉันถือว่ารุ่น 4 มีอยู่ แต่ไม่ถือว่าเป็นรุ่นย่อย นี่ไม่ใช่จุดประสงค์ทั่วไปโดยสิ้นเชิง แต่สำหรับสคริปต์อย่างรวดเร็วอาจเป็นประโยชน์:

set msbuild.exe=
for /D %%D in (%SYSTEMROOT%\Microsoft.NET\Framework\v4*) do set msbuild.exe=%%D\MSBuild.exe

สำหรับการใช้งานของฉันฉันกำลังออกจากชุดไฟล์ที่มีข้อผิดพลาดหากไม่ได้ผล:

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

@yoyo set bb.build.msbuild.exe=สำหรับอะไร จำเป็นหรือไม่หรือเป็นเพียงสิ่งประดิษฐ์สำหรับการตั้งค่าของคุณ
Elisée

@ Eliséeขออภัยนั่นคือการคัดลอก / วางผิด ในสภาพแวดล้อมของฉันฉันเรียกตัวแปร bb.build.msbuild.exe ฉันไม่สนใจแก้ไขอินสแตนซ์นั้นเมื่อฉันวางลงในคำตอบ แก้ไขแล้วขอบคุณที่ชี้ให้เห็น
yoyo

26

คุณสามารถใช้คำสั่ง PowerShell รุ่นทดลองนี้เพื่อรับข้อมูลMSBuildToolsPathจากรีจิสตรี

PowerShell (จากรีจิสทรี)

Resolve-Path HKLM:\SOFTWARE\Microsoft\MSBuild\ToolsVersions\* | 
Get-ItemProperty -Name MSBuildToolsPath

เอาท์พุต

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

หรือจากระบบไฟล์

PowerShell (จากระบบไฟล์)

Resolve-Path "C:\Program Files (x86)\MSBuild\*\Bin\amd64\MSBuild.exe"
Resolve-Path "C:\Program Files (x86)\MSBuild\*\Bin\MSBuild.exe"

เอาท์พุต

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

1
คำตอบที่ดีที่สุดในหัวข้อนี้
Teoman shipahi

21

คำแนะนำสำหรับการค้นหา MSBuild :

  • PowerShell: &"${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" -latest -prerelease -products * -requires Microsoft.Component.MSBuild -find MSBuild\**\Bin\MSBuild.exe
  • CMD: "%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -latest -prerelease -products * -requires Microsoft.Component.MSBuild -find MSBuild\**\Bin\MSBuild.exe

คำแนะนำสำหรับการค้นหา VSTest :

  • PowerShell: &"${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" -latest -prerelease -products * -requires Microsoft.VisualStudio.PackageGroup.TestTools.Core -find Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe
  • CMD: "%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -latest -prerelease -products * -requires Microsoft.VisualStudio.PackageGroup.TestTools.Core -find Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe

(โปรดทราบว่าคำแนะนำข้างต้นได้รับการแก้ไขเล็กน้อยจากทางราชการของ Microsoft โดยเฉพาะฉันได้รวมการ-prereleaseตั้งค่าสถานะเพื่ออนุญาตให้ติดตั้ง Preview และ RC เพื่อรับและการ-products *ตรวจสอบการติดตั้งเครื่องมือสร้าง Studio Visual)


ใช้เวลาเพียงสองปี แต่ในที่สุดในปี 2562 ไมโครซอฟท์ได้ฟังและทำให้เรามีวิธีในการค้นหาสิ่งที่จำเป็นเหล่านี้ ! ถ้าคุณติดตั้ง Visual Studio 2017 และ / หรือ 2019 แล้วvswhereคุณสามารถสอบถามโปรแกรมอรรถประโยชน์นี้ได้จากตำแหน่ง MSBuild และคณะ เนื่องจากvswhere อยู่เสมอที่ %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exeไม่มีการบูตและไม่ต้องใช้การเข้ารหัสฮาร์ดไดร์ฟอีกต่อไป

ความมหัศจรรย์เป็น-findพารามิเตอร์เพิ่มในรุ่น 2.6.2 คุณสามารถกำหนดเวอร์ชันที่คุณติดตั้งได้โดยการรันvswhereหรือตรวจสอบคุณสมบัติของไฟล์ หากคุณมีเวอร์ชั่นที่เก่ากว่าคุณสามารถดาวน์โหลดเวอร์ชันล่าสุดและเขียนทับสิ่งที่มีอยู่เดิม%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exeได้

vswhere.exeเป็นไฟล์ปฏิบัติการแบบสแตนด์อโลนดังนั้นคุณสามารถดาวน์โหลดและเรียกใช้ได้จากทุกที่ที่มีการเชื่อมต่ออินเทอร์เน็ต นั่นหมายความว่าสคริปต์การสร้างของคุณสามารถตรวจสอบว่าสภาพแวดล้อมที่พวกเขากำลังทำงานอยู่นั้นมีการตั้งค่าอย่างถูกต้องหรือไม่


มี 3 คำตอบที่พูดถึง vswhere รวมถึงความคิดเห็นของคุณที่มีต่อเอฟเฟกต์เหล่านี้ การเพิ่มคำตอบนี้ทำให้ซุปคำตอบแย่ลง
jpaugh

4
4 ตอนนี้ ฉันพบคำตอบนี้เป็นประโยชน์ในขณะที่ฉันไม่พบคำตอบ vswhere อื่น ๆ ที่เป็นประโยชน์
ประสานงาน

น่าสังเกตว่าเพียงเพราะ VSWHERE บอกว่าเป็น msbuild.exe ที่ใช้ไม่ได้หมายความว่าถ้าคุณพิมพ์msbuildที่บรรทัดคำสั่ง (โดยเฉพาะอย่างยิ่งบรรทัดคำสั่ง Visual Studio ถ้าใช้นั้น) นั่นคือสิ่งที่จะได้ใช้ เพื่อดูสิ่งที่ได้รับใช้ถ้าคุณพิมพ์ที่บรรทัดคำสั่งให้ทำเช่นนี้:msbuild where msbuildหากนั่นไม่ใช่การรายงานแบบเดียวกับ VSWHERE บอกว่าสิ่งที่ใหม่ที่สุดและยิ่งใหญ่ที่สุดคือคุณต้องทำเส้นทางแบบเต็มไปยังสิ่งที่msbuild.exeคุณต้องการใช้หรือทำการปรับตัวแปร PATH ของคุณให้เหมาะสม
Jinlye

ดังนั้นคำถามต่อไปคือคุณจะหาเส้นทางไปสู่ ​​vswhere ได้อย่างไร
#:

17

@AllenSanborn มีรุ่น powershell ที่ยอดเยี่ยม แต่บางคนมีความต้องการที่จะใช้สคริปต์ชุดเท่านั้นสำหรับการสร้าง

นี่เป็นเวอร์ชันที่ประยุกต์ใช้กับคำตอบที่ @ 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

สำหรับ Visual Studio 2017 / MSBuild 15, Aziz Atif (คนที่เขียนElmah ) เขียนสคริปต์ชุด

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

2
หมายเหตุ: เนื่องจาก VS2017 / msbuild 15.x ไม่ได้ใช้รีจิสตรีสำหรับพา ธ ของพวกเขาvswhereเป็นอีกทางเลือกหนึ่งในการกำหนดพา ธ msbuild
Roi Danton

1
นอกจากนี้ AzizAtif ก็เป็นผู้ชายเช่นกัน ลองดูที่นี่สำหรับการสร้าง 15.1 - github.com/linqpadless/LinqPadless/blob/master/build.cmd
JJS

2
นอกจากนี้ยังสามารถติดตั้ง vswhere ผ่าน Chocolatey: chocolatey.org/packages/vswhere
cowlinator

6

ใช้งานได้กับ Visual Studio 2015 และ 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

}


3
เครื่องมือสำหรับการสร้างการใช้งานvswhere -products *ตามที่ระบุในgithub.com/Microsoft/vswhere/wiki/Find-MSBuild
เทนเนสซี

สำหรับ vswhere คุณควรรู้เส้นทางที่มันอยู่ และแน่นอนคุณควรมีพาวเวอร์เชลล์สำหรับระบบสร้างของคุณ เพียงหนึ่งคำถาม: ทำไม amd64 มันมีอะไรพิเศษสำหรับการสร้างหรือไม่?
Maxim

เพิ่มขึ้นเนื่องจากโซลูชันนี้ใช้คีย์รีจิสตรีสำหรับ MSBuild 15 เช่นกันไม่ใช่ไลบรารีหรือสคริปต์ของบุคคลที่สาม จากความอยากรู้ "SxS \ VS7" หมายถึงอะไร สิ่งนั้นจะยังคงใช้ได้หรือไม่ในเวอร์ชัน VS?
Lazlo

5

ตำแหน่งที่ตั้งของรีจิสทรี

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\2.0
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\3.5

ให้ตำแหน่งสำหรับการปฏิบัติการ

แต่ถ้าคุณต้องการตำแหน่งที่จะบันทึกส่วนขยายงานก็เปิดอยู่

%ProgramFiles%\MSBuild

4
มันค่อนข้างเก่าฉันรู้ - แต่อย่างไรก็ตาม: บน x64-Systems, MSBuild-Folder ตั้งอยู่ใน ProgramFiles (x86)
Sascha

4

วิธีที่ง่ายที่สุดอาจเป็นการเปิด PowerShell และป้อน

dir HKLM:\SOFTWARE\Microsoft\MSBuild\ToolsVersions\

4

หนึ่งซับขึ้นอยู่กับคำตอบของ @ dh_cgn :

(Resolve-Path ([io.path]::combine(${env:ProgramFiles(x86)}, 'Microsoft Visual Studio', '*', '*', 'MSBuild', '*' , 'bin' , 'msbuild.exe'))).Path

มันเลือกเส้นทางเส้นทางที่มีอยู่ทั้งหมดของเช่น C:\Program Files (x86)\Microsoft Visual Studio\*\*\MSBuild\*\bin\msbuild.exe.

ดาวตัวแทนคือ:

  • ปี (2017)
  • visual studio edition (ชุมชน, มืออาชีพ, องค์กร)
  • รุ่นเครื่องมือ (15.0)

พึงระวังว่าคำสั่งนี้เลือกเส้นทางแรกที่ตรงกับนิพจน์ที่เรียงตามตัวอักษร หากต้องการ จำกัด ให้แคบลงเพียงแทนที่ wildcard ด้วยองค์ประกอบเฉพาะเช่น รุ่นปีหรือเครื่องมือ


3

บน Windows 2003 และใหม่กว่าให้พิมพ์คำสั่งนี้เป็น cmd:

cmd> where MSBuild
Sample result: C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe

หากไม่มีสิ่งใดปรากฏขึ้นแสดงว่า. NET Framework ไม่รวมอยู่ใน PATH ของระบบ MSBuild ควรอยู่ในโฟลเดอร์การติดตั้ง. NET พร้อมกับ. NET compilers (vbc.exe, csc.exe)


คำตอบนี้ไม่ได้เพิ่มมากไปกว่าคำตอบอื่น ๆ มันแข็งแกร่งน้อยกว่าคำตอบนี้
jpaugh

3

เริ่มต้นด้วย MSBuild 2017 (v15) ตอนนี้ MSBuild จะถูกติดตั้งในโฟลเดอร์ภายใต้ Visual Studio แต่ละเวอร์ชัน

นี่คือตัวอย่างของการพบ MSBuild.exe ในเครื่องของฉัน:

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)

ตามที่คำตอบก่อนหน้า 2017 ไม่ในการจัดเก็บข้อมูลเหล่านี้เป็นจริงในรีจิสทรี
jpaugh

2

ในการเรียกคืนพา ธ ของmsbuild 15 (Visual Studio 2017) ด้วยแบตช์จากรีจิสตรีที่ไม่มีเครื่องมือเพิ่มเติม:

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

เครื่องมือที่ดีกว่า:


1
คุณช่วยชีวิตฉันไว้
Hakan Fıstık

มีรุ่นPowerShellอยู่แล้ว ประมาณปี 2560 มีเหตุผลอะไรที่จะไม่เรียน Powershell ไหม?
jpaugh

2
@jpaugh ไม่ใช่ทุกระบบการสร้างที่มี PowerShell
Roi Danton

1

คุณคงไม่คิดว่าจะมีอะไรเพิ่มที่นี่อีกมากมาย แต่บางทีอาจถึงเวลาสำหรับวิธีการที่เป็นหนึ่งเดียวกันในทุก ๆ เวอร์ชัน ฉันได้รวมวิธีการค้นหารีจิสตรี (VS2015 และต่ำกว่า) เข้ากับการใช้vswhere (VS2017 ขึ้นไป) เพื่อหาสิ่งนี้:

function Find-MsBuild {
    Write-Host "Using VSWhere to find msbuild..."
    $path = & $vswhere -latest -requires Microsoft.Component.MSBuild -find MSBuild\**\Bin\MSBuild.exe | select-object -first 1

    if (!$path) {
        Write-Host "No results from VSWhere, using registry key query to find msbuild (note this will find pre-VS2017 versions)..."
        $path = Resolve-Path HKLM:\SOFTWARE\Microsoft\MSBuild\ToolsVersions\* |
                    Get-ItemProperty -Name MSBuildToolsPath |
                    sort -Property @{ Expression={ [double]::Parse($_.PSChildName) }; Descending=$true } |
                    select -exp MSBuildToolsPath -First 1 |
                    Join-Path -ChildPath "msbuild.exe"
    }

    if (!$path) {
        throw "Unable to find path to msbuild.exe"
    }

    if (!(Test-Path $path)) {
        throw "Found path to msbuild as $path, but file does not exist there"
    }

    Write-Host "Using MSBuild at $path..."
    return $path
}

1

มีคำตอบที่ถูกต้องมากมาย อย่างไรก็ตามที่นี่ One-Liner ใน PowerShell ฉันใช้เพื่อกำหนดเส้นทาง MSBuild สำหรับรุ่นล่าสุด :

Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\MSBuild\ToolsVersions\' | 
    Get-ItemProperty -Name MSBuildToolsPath | 
    Sort-Object PSChildName | 
    Select-Object -ExpandProperty MSBuildToolsPath -first 1

+1 มีประโยชน์จริง ๆ ! แต่ในคำตอบของฉันฉันใช้-last 1(แทน-first 1เพื่อรับรุ่นล่าสุด) และเชื่อมต่อชื่อไฟล์ (เพื่อให้ได้เส้นทางที่สมบูรณ์และไม่ใช่แค่โฟลเดอร์)
Mariano Desanze

1

วิธี PowerShell นี้ได้รับเส้นทางไป msBuild จากหลายแหล่ง พยายามตามลำดับ:

  1. ก่อนใช้ vswhere (เพราะ Visual Studio ดูเหมือนจะมีรุ่นล่าสุดของ msBuild) เช่น

    C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\MSBuild.exe
  2. หากไม่พบลองรีจิสตรี (เวอร์ชันเฟรมเวิร์ก) เช่น

    C:\Windows\Microsoft.NET\Framework64\v4.0.30319\msbuild.exe

รหัส PowerShell:

Function GetMsBuildPath {

    Function GetMsBuildPathFromVswhere {
        # Based on https://github.com/microsoft/vswhere/wiki/Find-MSBuild/62adac8eb22431fa91d94e03503d76d48a74939c
        $vswhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe"
        $path = & $vswhere -latest -prerelease -products * -requires Microsoft.Component.MSBuild -property installationPath
        if ($path) {
            $tool = join-path $path 'MSBuild\Current\Bin\MSBuild.exe'
            if (test-path $tool) {
                return $tool
            }
            $tool = join-path $path 'MSBuild\15.0\Bin\MSBuild.exe'
            if (test-path $tool) {
                return $tool
            }
        }
    }

    Function GetMsBuildPathFromRegistry {
        # Based on Martin Brandl's answer: https://stackoverflow.com/a/57214958/146513
        $msBuildDir = Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\MSBuild\ToolsVersions\' |
            Get-ItemProperty -Name MSBuildToolsPath |
            Sort-Object PSChildName |
            Select-Object -ExpandProperty MSBuildToolsPath -last 1
        $msBuildPath = join-path $msBuildDir 'msbuild.exe'
        if (test-path $msBuildPath) {
            return $msBuildPath
        }
    }

    $msBuildPath = GetMsBuildPathFromVswhere
    if (-Not $msBuildPath) {
        $msBuildPath = GetMsBuildPathFromRegistry
    }
    return $msBuildPath
}

0

สำหรับ Visual Studio 2017 โดยไม่ทราบรุ่นที่แน่นอนคุณสามารถใช้สิ่งนี้ในสคริปต์ชุด:

FOR /F "tokens=* USEBACKQ" %%F IN (`where /r "%PROGRAMFILES(x86)%\Microsoft Visual 
Studio\2017" msbuild.exe ^| findstr /v /i "amd64"`) DO (SET msbuildpath=%%F)

คำสั่ง findstr คือเพิกเฉย msables ที่สร้างได้ (ในตัวอย่างนี้ amd64)


0

เพิ่มสาขา vswhere สำหรับhttps://github.com/linqpadless/LinqPadless/blob/master/build.cmdทำงานได้ดีในคอมพิวเตอร์ของฉันและสาขา vswhere ทำงานบนคอมพิวเตอร์ของเพื่อนของฉัน อาจจะเป็นสาขา vswhere ควรก้าวไปข้างหน้าเป็นเช็คครั้งแรก

@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 :build

for /f "usebackq tokens=1* delims=: " %%i in (`"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -latest -requires Microsoft.Component.MSBuild`) do (
  if /i "%%i"=="installationPath" set InstallDir=%%j
)

if exist "%InstallDir%\MSBuild\15.0\Bin\MSBuild.exe" (
  set "MSBUILD=%InstallDir%\MSBuild\15.0\Bin\MSBuild.exe"
)
if exist "%MSBUILD%" goto :build
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
)
echo %MSBUILD_VERSION_MAJOR% %MSBUILD_VERSION_MINOR%
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"
popd
goto :EOF

:build
setlocal
"%MSBUILD%" -restore -maxcpucount %1 /p:Configuration=%2 /v:m %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


0

รับ MsBuild เวอร์ชันล่าสุด วิธีที่ดีที่สุดสำหรับการติดตั้ง msbuild ทุกประเภทสำหรับสถาปัตยกรรมโปรเซสเซอร์ที่แตกต่างกัน (Power Shell):

function Get-MsBuild-Path
{
    $msbuildPathes = $null
    $ptrSize = [System.IntPtr]::Size
    switch ($ptrSize) {
        4 {
            $msbuildPathes =
            @(Resolve-Path "${Env:ProgramFiles(x86)}\Microsoft Visual Studio\*\*\MSBuild\*\Bin\msbuild.exe" -ErrorAction SilentlyContinue) +
            @(Resolve-Path "${Env:ProgramFiles(x86)}\MSBuild\*\Bin\MSBuild.exe" -ErrorAction SilentlyContinue) +
            @(Resolve-Path "${Env:windir}\Microsoft.NET\Framework\*\MSBuild.exe" -ErrorAction SilentlyContinue)
        }
        8 {
            $msbuildPathes =
            @(Resolve-Path "${Env:ProgramFiles(x86)}\Microsoft Visual Studio\*\*\MSBuild\*\Bin\amd64\msbuild.exe" -ErrorAction SilentlyContinue) +
            @(Resolve-Path "${Env:ProgramFiles(x86)}\MSBuild\*\Bin\amd64\MSBuild.exe" -ErrorAction SilentlyContinue) +
            @(Resolve-Path "${Env:windir}\Microsoft.NET\Framework64\*\MSBuild.exe" -ErrorAction SilentlyContinue)
        }
        default {
            throw ($msgs.error_unknown_pointersize -f $ptrSize)
        }
    }

    $latestMSBuildPath = $null
    $latestVersion = $null
    foreach ($msbuildFile in $msbuildPathes)
    {
        $msbuildPath = $msbuildFile.Path
        $versionOutput = & $msbuildPath -version
        $fileVersion = (New-Object System.Version($versionOutput[$versionOutput.Length - 1]))
        if (!$latestVersion -or $latestVersion -lt $fileVersion)
        {
            $latestVersion = $fileVersion
            $latestMSBuildPath = $msbuildPath
        }
    }

    Write-Host "MSBuild version detected: $latestVersion" -Foreground Yellow
    Write-Host "MSBuild path: $latestMSBuildPath" -Foreground Yellow

    return $latestMSBuildPath;
}

-2

ถ้าคุณต้องการคอมไพล์โครงการ Delphi ให้ดูที่"ข้อผิดพลาด MSB4040 ไม่มีเป้าหมายในโครงการ" เมื่อใช้ msbuild + Delphi2009

คำตอบที่ถูกต้องมีการกล่าวว่า: "มีไฟล์แบตช์ที่เรียกว่าrsvars.bat (ค้นหาในโฟลเดอร์ RAD Studio) เรียกว่าก่อนที่จะเรียก MSBuild และจะตั้งค่าตัวแปรสภาพแวดล้อมที่จำเป็นตรวจสอบให้แน่ใจว่าโฟลเดอร์นั้นถูกต้องใน rsvars ถ้าคุณมีคอมไพเลอร์ในตำแหน่งอื่นให้เป็นค่าเริ่มต้น "

ค้างคาวนี้จะไม่เพียง แต่ปรับปรุงตัวแปรสภาพแวดล้อมของเส้นทางไปยังโฟลเดอร์. NET ที่เหมาะสมด้วยรุ่น MSBuild.exe ที่เหมาะสม แต่ยังลงทะเบียนตัวแปรที่จำเป็นอื่น ๆ


คำตอบนั้นไม่เกี่ยวข้องกับ Delphi และไม่แข็งแกร่งสำหรับผู้ใช้ Delphi
Nashev

2
ขออภัยที่กระชับ ฉันหมายถึงแข็งแกร่งมากขึ้นเช่นเดียวกับทำงานได้มากกว่าเดลฟี อาจมีวิธีที่ง่ายกว่าในการทำใน Delphi แต่ OP ไม่ได้ถามเกี่ยวกับ Delphi และหัวข้อนี้มีคำตอบประมาณ 18 คำตอบที่ไม่กี่คนจะเห็น หากเป็นสิ่งสำคัญสำหรับคุณที่คนอื่นจะเห็นสิ่งนี้ฉันขอแนะนำให้คุณสร้างคำถามใหม่สำหรับ Delphi และตอบคำถามด้วยตนเอง ถ้าเราได้คำตอบที่น้อยกว่า 6 คำตอบที่ครอบคลุม MSBuild ทุกรุ่นฉันจะมีความสุขมาก
jpaugh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.