Как я могу получить текущий каталог в скрипт MSBuild?


в моем сценарии msbuild мне нужно передать полный каталог в качестве параметра. Как это можно получить?

пример: я запускаю скрипт из C:dev, я хочу относительный темп пути, поэтому я после C:devtemp

примечание: Я не знаю из какой папки будет выполняться скрипт.

3 62

3 ответа:

Игорь довольно близко. MSBuildProjectDirectory - Это свойство, которое даст вам полный путь к файлу проекта, который был вызван в командной строке. Так что если у вас есть следующие скрипты:

  • C:\temp\MyProj.прое
  • C:\shared\shared.цели

и MyProj.proj импорт shared.targets и это тот, который передается в msbuild.exe-файла, то значение MSBuildProjectDirectory всегда будет C:\temp даже если вы ссылаетесь на то, что внутри общий.цели. Если ваш общий.цели требуют знания пути, тогда они должны быть объявлены в известных свойствах. Например, файлы проекта C# определяют значение для OutputPath и общий файл Microsoft.Common.targets использует это свойство.

Edit: MSBuild 4

если вы используете MSBuild 4, Теперь вы можете использовать свойства для этого типа значения.

  • MSBuildThisFile
  • MSBuildThisFileDirectory
  • MSBuildThisFileDirectoryNoRoot
  • MSBuildThisFileExtension
  • msbuildthisfilefullpath, представляющая собой
  • MSBuildThisFileName

см.http://sedodream.com/2010/03/11/MSBuild40ReservedProperties.aspx.

вот 3 цели, которые полезны.

WhereAmI-это тот, который я использую при попытке выяснить мой текущий каталог, конечно. Остальные тоже информативны. (Некоторые из них выходят за рамки вопроса).

<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>

Если вы используете "внешний файл msbuild" и вам нужно передать имя файла или путь к нему (потому что внешние файлы msbuild не любят относительные файлы, если они не находятся в том же каталоге, что и вызов .msbuild file)....вот это удобно (3.5 а я верю) задач.

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

MSBuild зарезервировал свойство под названием MSBuildProjectDirectory, что соответствует абсолютному пути к каталогу, в котором находится файл проекта или сценария, C:\Dev в твоем случае. Поэтому "$(MSBuildProjectDirectory)\temp" - это именно то, что вы ищете.