В моем сценарии MSBuild я должен передать полный каталог в качестве параметра. Как я могу получить его?
Пример: Я запускаю скрипт от C:\dev, и я хочу временный файл относительного пути, таким образом, я после C:\dev\temp.
Примечание: Я не знаю, от которой папки будет запущен скрипт.
Igor довольно близок. MSBuildProjectDirectory
- это свойство, которое даст вам полный путь к файлу проекта, который был вызван в командной строке. Итак, если у вас есть следующие скрипты:
И MyProj.proj
импортирует shared.targets
, и именно он передан msbuild. exe, то значение для MSBuildProjectDirectory
всегда будет C:\temp, даже если вы ссылаетесь на него внутри shared.targets. Если ваш shared.targets требует знания путей, то они должны быть объявлены в известных свойствах. Например, файлы проекта C# определяют значение для OutputPath
, а общий файл Microsoft.Common.targets
использует это свойство.
Edit: MSBuild 4
Если вы используете MSBuild 4, вы также можете использовать эти свойства для данного типа значения.
См. http://sedodream.com/2010/03/11/MSBuild40ReservedProperties.aspx.
MSBUILD имеет зарезервированное свойство под названием MSBUILDPROECTDirectory
, который заключается в абсолютном пути каталога, в котором находится файл проекта или сценария, C: \ dev в вашем кейс. Поэтому «$ (msbuildProjectDirectory) \ Temp»
именно то, что вы ищете.
Вот 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)'" />