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

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

Пример: Я запускаю скрипт от C:\dev, и я хочу временный файл относительного пути, таким образом, я после C:\dev\temp.

Примечание: Я не знаю, от которой папки будет запущен скрипт.

65
задан Peter Mortensen 25 July 2019 в 23:35
поделиться

3 ответа

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

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

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

Edit: MSBuild 4

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

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

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

93
ответ дан 24 November 2019 в 15:18
поделиться

MSBUILD имеет зарезервированное свойство под названием MSBUILDPROECTDirectory , который заключается в абсолютном пути каталога, в котором находится файл проекта или сценария, C: \ dev в вашем кейс. Поэтому «$ (msbuildProjectDirectory) \ Temp» именно то, что вы ищете.

11
ответ дан 24 November 2019 в 15:18
поделиться

Вот 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 File» и необходимо пройти имя файла или пути к нему (потому что внешние файлы MSBuild не любят относительные файлы, если они не в том же каталоге, что и файл вызова .msbuild). ... вот удобный (3,5 и выше я верю) задачу.

    <ConvertToAbsolutePath Paths="..\"> <!-- Some relative path here -->
      <Output TaskParameter="AbsolutePaths" PropertyName="MyAbsolutionPathProperty"/>
    </ConvertToAbsolutePath>            
    <Message Text="'MyAbsolutionPathProperty' = '$(MyAbsolutionPathProperty)'" />   
52
ответ дан 24 November 2019 в 15:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: