Как я могу получить текущий каталог в скрипте MSBuild?
В моем скрипте MSBuild мне нужно передать полный каталог в качестве параметра. Как я могу получить это?
Пример: я запускаю сценарий из C:\dev и мне нужен относительный путь temp, поэтому я после C:\dev\temp.
Примечание: я не знаю, из какой папки будет запускаться скрипт.
Ответы
Ответ 1
Игорь довольно близко. MSBuildProjectDirectory
- это свойство, которое даст вам полный путь к файлу проекта, который был вызван в командной строке. Так что если у вас есть следующие сценарии:
- C:\TEMP\MyProj.proj
- C:\Shared\shared.targets
И MyProj.proj
импортирует shared.targets
, и это тот, который передается в msbuild.exe, тогда значение для MSBuildProjectDirectory
всегда будет C:\temp, даже если вы ссылаетесь на него внутри shared.targets. Если ваши shared.targets требуют знания пути, они должны быть объявлены в известных свойствах. Например, файлы проекта С# определяют значение для OutputPath
, а общий файл Microsoft.Common.targets
использует это свойство.
Изменение: MSBuild 4
Если вы используете MSBuild 4, вы также можете использовать эти свойства для этого типа значения.
- MSBuildThisFile
- MSBuildThisFileDirectory
- MSBuildThisFileDirectoryNoRoot
- MSBuildThisFileExtension
- MSBuildThisFileFullPath
- MSBuildThisFileName
Смотрите http://sedodream.com/2010/03/11/MSBuild40ReservedProperties.aspx.
Ответ 2
Здесь полезны 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).... вот удобная задача (3.5 и выше).
<ConvertToAbsolutePath Paths="..\"> <!-- Some relative path here -->
<Output TaskParameter="AbsolutePaths" PropertyName="MyAbsolutionPathProperty"/>
</ConvertToAbsolutePath>
<Message Text="'MyAbsolutionPathProperty' = '$(MyAbsolutionPathProperty)'" />
Ответ 3
MSBuild имеет зарезервированное свойство MSBuildProjectDirectory
, которое соответствует абсолютному пути каталога, в котором вы создаете проект или script файл, C:\Dev в вашем случае. Поэтому "$(MSBuildProjectDirectory)\temp"
- это именно то, что вы ищете.