在我的MSBuild脚本中,我需要将完整的目录作为参数传递。我该如何获取它?
例如:我正在从 C:\dev 运行脚本,我想要一个相对路径 temp,因此我需要 C:\dev\temp。
注意:我不知道脚本将从哪个文件夹运行。
例如:我正在从 C:\dev 运行脚本,我想要一个相对路径 temp,因此我需要 C:\dev\temp。
注意:我不知道脚本将从哪个文件夹运行。
Igor说得很接近了。 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。
以下是三个有帮助的目标。
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
? - binkiCD
如果没有参数,则显示当前路径而不更改它。我假设我们在谈论 cmd,而不是如果您通过 xbuild
运行脚本会发生什么;-)。 - binkiCD
(没有参数)打印的内容)。抱歉,我在挑剔。但是,例如,在AppData\Local\Temp
中,如果您只想知道自己在哪里,那么dir .
的输出非常无用,因为其中有很多文件... - binkiMSBuild有一个保留属性叫做MSBuildProjectDirectory
,它指的是项目或脚本文件所在目录的绝对路径,在你的情况下是C:\Dev。因此,"$(MSBuildProjectDirectory)\temp"
就是你要找的。