web-dev-qa-db-fra.com

Comment appeler la version de MSBuild de Visual Studio 2017 RC à partir d'un fichier BAT?

Des versions antérieures de MSBuild peuvent être trouvées ici: %programfiles(x86)%\msbuild\<version>\bin\msbuild.exe.

Mais pour Visual Studio 2017RC, le chemin est %programfiles(x86)%\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\msbuild.exe. Le type d'installation: entreprise, communauté ou professionnel, semble faire partie du chemin. Et cela rend difficile la spécification du chemin correct vers msbuild dans un fichier BAT qui devrait fonctionner sur de nombreux ordinateurs avec différentes versions de Visual Studio 2017.

Quelle est la meilleure façon d'appeler la version de Msbuild de Visual Studio 2017 RC à partir d'un fichier bat? Ou de PowerShell?

44
Arve

Microsoft a créé un outil permettant de localiser Visual Studio 2017 et versions ultérieures https://github.com/Microsoft/vswhere

Cette option et les plus récentes sont décrites dans this blog.

18
Arve

La manière soutenue

Le moteur de configuration de VS2017 dispose d'une API d'interopérabilité qui vous permet de demander des informations sur la ou les instances de VS2017 installées. Il y a un paquet NuGet , et même n exemple pour interroger, y compris le chemin d'installation. Pour la consommation dans un fichier batch ou PS, vous pouvez simplement réécrire l'exemple d'application et l'appeler à partir de votre script pour générer les informations dont vous avez besoin.

La manière non supportée

Le moteur de configuration du VS conserve un stock de ses données sous %ProgramData%\Microsoft\VisualStudio\Packages\_Instances. Il y aura un dossier pour chaque instance de VS2017, dans lequel se trouve un fichier state.json Contenant des informations sur cette installation, y compris le chemin d'installation.

Comme vous devez extraire les informations du fichier .json, vous pouvez écrire une application que vous appelez à partir de votre fichier de script ou créer une logique d’analyse directement dans votre script. Cela sera évidemment fragile, car le schéma JSON ou l'emplacement du fichier peut changer.

La méthode de la force brute

En supposant que vous utilisiez le chemin d'installation par défaut, vous pouvez simplement rechercher récursivement msbuild.exe sous %ProgramFiles(x86)%\Microsoft Visual Studio\ (il semble qu'il y aura un msbuild.exe 32 bits et 64 bits pour chaque instance de système virtuel). Ce serait probablement le plus facile à faire dans votre fichier de script, mais dépend du chemin d’installation par défaut (ou de tout autre chemin codé en dur dans lequel vous souhaitez effectuer une recherche).

Changer les exigences de votre environnement de développement

La dernière chose que vous pouvez faire est d’obliger les développeurs à utiliser (ou à invoquer d’une manière ou d’une autre) le vsdevcmd.bat Pour utiliser l’environnement de développement VS. Cela leur permettra d'obtenir MSBuild, ainsi que tous les autres outils de l'environnement VS, sur leur% PATH%. Cela impose une exigence à votre équipe de développeurs, mais restera toujours un moyen officiellement pris en charge pour trouver msbuild.exe.

25
Jimmy

Manière la plus simple ...

Right at the bottom of the download page on VS

  • Profit; les outils de construction s’installent dans un emplacement distinct, standard partout où vous l’installez, quel que soit votre numéro de référence VS (les professionnels/entreprises/communautés s’installent tous dans des chemins différents)
  • Nouvel emplacement C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\msbuild.exe
8
Chris McKee

Publier ceci pour les personnes qui tentent toujours de localiser la dernière version de msbuild sur une machine et de revenir à une version plus ancienne si celle-ci est disponible. Je trouve que cet extrait de powershell fait l'affaire, ce qui peut facilement être invoqué à partir d'un fichier bat .

Function Find-MsBuild([int] $MaxVersion = 2017)
{
    $agentPath = "$Env:programfiles (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\msbuild.exe"
    $devPath = "$Env:programfiles (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\msbuild.exe"
    $proPath = "$Env:programfiles (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\msbuild.exe"
    $communityPath = "$Env:programfiles (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\msbuild.exe"
    $fallback2015Path = "${Env:ProgramFiles(x86)}\MSBuild\14.0\Bin\MSBuild.exe"
    $fallback2013Path = "${Env:ProgramFiles(x86)}\MSBuild\12.0\Bin\MSBuild.exe"
    $fallbackPath = "C:\Windows\Microsoft.NET\Framework\v4.0.30319"

    If ((2017 -le $MaxVersion) -And (Test-Path $agentPath)) { return $agentPath } 
    If ((2017 -le $MaxVersion) -And (Test-Path $devPath)) { return $devPath } 
    If ((2017 -le $MaxVersion) -And (Test-Path $proPath)) { return $proPath } 
    If ((2017 -le $MaxVersion) -And (Test-Path $communityPath)) { return $communityPath } 
    If ((2015 -le $MaxVersion) -And (Test-Path $fallback2015Path)) { return $fallback2015Path } 
    If ((2013 -le $MaxVersion) -And (Test-Path $fallback2013Path)) { return $fallback2013Path } 
    If (Test-Path $fallbackPath) { return $fallbackPath } 

    throw "Yikes - Unable to find msbuild"
}


$msbuildPath = Find-MsBuild 2017
6
alastairtree

Maintenant que VS 2017 est sorti, j'ai pensé qu'il pourrait être utile d'ajouter mes 2 centimes:

Création d'un fichier batch:

Bloc-notes ouvert

Copiez le texte suivant et collez-le dans le bloc-notes, en remplaçant la solution que vous souhaitez générer par [Mon nom de solution ici]:

@echo off

:variables
SET msBuildLocation="C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\msbuild.exe"
SET solutionDirectory=[My Solution Location Here]
SET batchFileLocation=[BatchFileLocation Here]

cd %solutionDirectory%

echo Building MS files for [My Solution Name Here].

call %msBuildLocation% [My Solution Name].sln /p:Configuration=Debug /m:4 /v:M /fl /flp:LogFile=msbuild.log;Verbosity=Normal /nr:false  /consoleloggerparameters:Summary;ShowTimestamp;ShowEventId;PerformanceSummary
echo -
echo --------Done building [My solution name here].--------------
echo -

cd %batchFileLocation%

Enregistrez votre fichier de commandes sous le nom de votre choix avec l’extension .bat. Assurez-vous de sélectionner tous les fichiers au lieu de .txt, sinon cela ne fonctionnera pas. Appelez le fichier de commandes en exécutant la commande cd où vous l'avez enregistré et cela devrait fonctionner. Ou, double-cliquez simplement sur. Terminé.

S'il vous plaît noter que ma version de Visual Studio est la communauté; vous devrez remplacer le chemin par la version appropriée.

4
cloudstrifebro

J'exécute également les outils de construction à partir d'un fichier bat sur mon serveur CI: Le nouvel emplacement que j'ai trouvé est le suivant:

% programfiles (x86)%\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\msbuild.exe

3
Ali Hus

Si vous avez installé l'aperçu des outils .NET Core 3 ou une version ultérieure, l'interface de ligne de commande dotnet devrait être disponible sur l'interface %PATH% _ par défaut (même si vous ne construisez pas de projet .NET Core), vous pouvez donc essayer dotnet msbuild. Réf. https://github.com/dotnet/docs/blob/master/docs/core/preview3/tools/dotnet-msbuild.md

1
Stylpe