在我的msbuild脚本中,我需要将完整目录作为参数传递。怎么能得到它?
示例:我正在从C:\ dev运行脚本,我想要一个相对路径temp,所以我在C:\ dev \ temp
之后注意:我不知道脚本将从哪个文件夹运行。
答案 0 :(得分:92)
MSBuildProjectDirectory
是一个属性,它将为您提供在命令行上调用的项目文件的完整路径。因此,如果您有以下脚本:
并且MyProj.proj
导入shared.targets
这是传递给msbuild.exe的那个,那么MSBuildProjectDirectory
的值将始终为 C:\ temp ,即使您正在引用shared.targets内部。如果您的shared.targets需要路径知识,那么应该在已知属性中声明它们。例如,C#项目文件定义OutputPath
的值,共享文件Microsoft.Common.targets
使用该属性。
编辑:MSBuild 4
如果您使用的是MSBuild 4,则现在可以使用此类值的属性。
请参阅http://sedodream.com/2010/03/11/MSBuild40ReservedProperties.aspx。
答案 1 :(得分:50)
以下是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)'" />
答案 2 :(得分:11)
MSBuild保留了名为MSBuildProjectDirectory
的属性,该属性是项目或脚本文件所在目录的绝对路径,在您的情况下为C:\ Dev。因此,"$(MSBuildProjectDirectory)\temp"
正是您所需要的。