我如何获得当前目录在MSBuild脚本?
在我的MSBuild脚本中,我需要传递完整的目录作为参数。 怎么能得到它?
例如:我从C:\ dev运行脚本,我想要一个相对pathtemp,所以我在C:\ dev \ temp之后
注意:我不知道脚本将从哪个文件夹运行。
伊戈尔非常接近。 MSBuildProjectDirectory
是将为您提供在命令行上调用的项目文件的完整path的属性。 所以,如果你有以下脚本:
- C:\ TEMP \ MyProj.proj
- C:\共享\ shared.targets
而MyProj.proj
导入shared.targets
,这是传递给msbuild.exe的那个,那么即使你引用了shared.targets里面的内容,MSBuildProjectDirectory的值也总是C:\ temp 。 如果您的shared.targets需要path知识,那么应该在已知的属性中声明这些。 例如,C#项目文件定义了OutputPath
的值,共享文件Microsoft.Common.targets
使用该属性。
编辑:MSBuild 4
如果您正在使用MSBuild 4,现在可以使用这种types的值的属性。
- 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文件”,并且需要传递一个文件名或path(因为如果外部msbuild文件与调用的.msbuild文件不在相同的目录中,它们不会像相关文件那样)。这里是一个方便(3.5和我相信)任务。
<ConvertToAbsolutePath Paths="..\"> <!-- Some relative path here --> <Output TaskParameter="AbsolutePaths" PropertyName="MyAbsolutionPathProperty"/> </ConvertToAbsolutePath> <Message Text="'MyAbsolutionPathProperty' = '$(MyAbsolutionPathProperty)'" />
MSBuild已经保留了名为MSBuildProjectDirectory
属性,这是你项目或脚本文件所在目录的绝对path,C:\ Dev在你的情况下。 因此"$(MSBuildProjectDirectory)\temp"
正是你正在寻找。