web-dev-qa-db-fra.com

Comment puis-je obtenir le répertoire actuel dans un script MSBuild?

Dans mon script MSBuild, je dois passer le répertoire complet en paramètre. Comment puis-je l'avoir?

Exemple: J'exécute le script à partir de C:\dev et je veux un chemin d'accès relatif temp, donc je suis après C:\dev\temp.

Remarque: je ne sais pas à partir de quel dossier le script sera exécuté.

64
Grzenio

Igor est assez proche. MSBuildProjectDirectory est la propriété qui vous donnera le chemin d'accès complet au fichier de projet qui a été appelé sur la ligne de commande. Donc, si vous avez les scripts suivants:

  • C:\temp\MyProj.proj
  • C:\shared\shared.targets

Et MyProj.proj importe shared.targets et c'est celui transmis à msbuild.exe, la valeur de MSBuildProjectDirectory sera toujours C:\temp même si vous font référence à l'intérieur de shared.targets. Si votre shared.targets nécessite une connaissance des chemins, ceux-ci doivent être déclarés dans des propriétés connues. Par exemple, les fichiers de projet C # définissent la valeur de OutputPath et le fichier partagé Microsoft.Common.targets utilise cette propriété.

Modifier: MSBuild 4

Si vous utilisez MSBuild 4, vous pouvez désormais utiliser les propriétés de ce type de valeur.

  • MSBuildThisFile
  • MSBuildThisFileDirectory
  • MSBuildThisFileDirectoryNoRoot
  • MSBuildThisFileExtension
  • MSBuildThisFileFullPath
  • MSBuildThisFileName

Voir http://sedodream.com/2010/03/11/MSBuild40ReservedProperties.aspx .

92

Voici 3 cibles utiles.

WhereAmI est celui que j'utilise lorsque j'essaie de comprendre mon répertoire actuel bien sûr. Les autres sont également informatifs. (Certains dépassent le cadre de la question).

<Target Name="WhereAmI">
    <Message Text=" Here I Am  " />
    <Exec Command="dir ." />
    <Message Text=" " />
</Target>



<Target Name="ShowReservedProperties" AfterTargets="BeforeBuild">  
    <Message Text=" MSBuildProjectDirectory  = $(MSBuildProjectDirectory)" Importance="high" />     
    <Message Text=" MSBuildProjectFile  = $(MSBuildProjectFile)" Importance="high" />   
    <Message Text=" MSBuildProjectExtension  = $(MSBuildProjectExtension)" Importance="high" />     
    <Message Text=" MSBuildProjectFullPath  = $(MSBuildProjectFullPath)" Importance="high" />   
    <Message Text=" MSBuildProjectName  = $(MSBuildProjectName)" Importance="high" />   
    <Message Text=" MSBuildBinPath  = $(MSBuildBinPath)" Importance="high" />   
    <Message Text=" MSBuildProjectDefaultTargets  = $(MSBuildProjectDefaultTargets)" Importance="high" />   
    <Message Text=" MSBuildExtensionsPath  = $(MSBuildExtensionsPath)" Importance="high" />     
    <Message Text=" MSBuildStartupDirectory  = $(MSBuildStartupDirectory)" Importance="high"/>
</Target>


  <Target Name="ShowOtherProperties">  
    <Message Text="  " />
    <Message Text="  " />
    <Message Text=" Environment (SET) Variables*       " />
    <Message Text=" ---------------------------        " />
    <Message Text=" COMPUTERNAME = *$(COMPUTERNAME)*   " />
    <Message Text=" USERDNSDOMAIN = *$(USERDNSDOMAIN)* " />
    <Message Text=" USERDOMAIN = *$(USERDOMAIN)*       " />
    <Message Text=" USERNAME = *$(USERNAME)*           " />
</Target>

Si vous utilisez un "fichier msbuild externe" et devez lui donner un nom de fichier ou un chemin d'accès (car les fichiers msbuild externes n'aiment pas les fichiers relatifs s'ils ne se trouvent pas dans le même répertoire que le fichier .msbuild appelant) .... voici une tâche pratique (3,5 et plus je crois).

    <ConvertToAbsolutePath Paths="..\"> <!-- Some relative path here -->
      <Output TaskParameter="AbsolutePaths" PropertyName="MyAbsolutionPathProperty"/>
    </ConvertToAbsolutePath>            
    <Message Text="'MyAbsolutionPathProperty' = '$(MyAbsolutionPathProperty)'" />   
52
granadaCoder

MSBuild a réservé une propriété appelée MSBuildProjectDirectory, qui correspond au chemin absolu du répertoire où se trouve votre fichier de script ou de script, C:\Dev dans votre cas. Par conséquent, "$(MSBuildProjectDirectory)\temp" est exactement ce que vous recherchez.

11
Igor Korkhov