【发布时间】:2011-01-07 20:23:33
【问题描述】:
在我的 MSBuild 脚本中,我需要将完整目录作为参数传递。我怎么才能得到它?
示例:我正在从 C:\dev 运行脚本,并且我想要一个相对路径 temp,所以我在 C:\dev 之后\temp.
注意:我不知道脚本将从哪个文件夹运行。
【问题讨论】:
-
您的临时文件夹是否始终是运行此脚本的位置的子文件夹?
在我的 MSBuild 脚本中,我需要将完整目录作为参数传递。我怎么才能得到它?
示例:我正在从 C:\dev 运行脚本,并且我想要一个相对路径 temp,所以我在 C:\dev 之后\temp.
注意:我不知道脚本将从哪个文件夹运行。
【问题讨论】:
伊戈尔非常接近。 MSBuildProjectDirectory 是一个属性,它将为您提供在命令行上调用的项目文件的完整路径。因此,如果您有以下脚本:
而MyProj.proj 导入shared.targets,这是传递给msbuild.exe 的那个,那么MSBuildProjectDirectory 的值将始终为C:\temp,即使您在其中引用它也是如此共享目标。如果您的 shared.targets 需要路径知识,那么这些应该在已知属性中声明。例如,C# 项目文件定义了 OutputPath 的值,共享文件 Microsoft.Common.targets 使用该属性。
编辑:MSBuild 4
如果您使用的是 MSBuild 4,也可以将这些属性用于此类值。
见http://sedodream.com/2010/03/11/MSBuild40ReservedProperties.aspx。
【讨论】:
这里有三个有用的目标。
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)'" />
【讨论】:
dir . 而不是cd?
dir . 打印出来的内容远不止工作目录。 dir '.' 除了 CWD 之外还打印出一条错误消息,因为不存在这样的文件。 CD 不带参数显示当前路径而不改变它。我假设我们在这里谈论的是 cmd,而不是如果您通过 xbuild 运行脚本会发生什么;-)。
CD(不带参数)打印出来的内容)。对不起,我在吹毛求疵。但是,例如,在AppData\Local\Temp 中,如果您只想知道自己在哪里,dir . 的输出就非常无用,因为那里有很多文件……
MSBuild 具有名为MSBuildProjectDirectory 的保留属性,它指向您的项目或脚本文件所在目录的绝对路径,在您的情况下为 C:\Dev。因此,"$(MSBuildProjectDirectory)\temp" 正是您要找的。p>
【讨论】: