Как я могу получить текущий каталог в скрипт MSBuild?
в моем сценарии msbuild мне нужно передать полный каталог в качестве параметра. Как это можно получить?
пример: я запускаю скрипт из C:dev, я хочу относительный темп пути, поэтому я после C:devtemp
примечание: Я не знаю из какой папки будет выполняться скрипт.
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)'" />