在MSBuild中获取父目录

12

在NAnt中,我有一个非常简单的属性用于获取我的项目根目录,它看起来像这样:

<property
name="project.root.folder" 
value="${directory::get-parent-directory(directory::get-parent-directory(project.local.folder))}"
/>

这将带我回到我的项目根目录,从那里我构建所有的路径。

在MSBuild中,我可以使用$(MSBuildProjectDirectory)获取当前目录,但我想获取父目录的完整路径。NAnt使用directory::get-parent-directory很有效,我希望MSBuild中也有类似的东西。

我发现了一个类似的旧问题(https://dev59.com/xnRB5IYBdhLWcg3wyqAd),但我认为一定有更简单的方法可用,肯定!

Sam : )


看起来像什么?啊哈,我为你修好了! - alternative
哈哈,不确定你是怎么做到的,但谢谢! - samaspin
BAMBAM:使用4个空格进行缩进。 - alternative
2个回答

20

我假设这是 MSBuild 4.0。你可以这样做:

<PropertyGroup>
     <RootFolder>$([System.IO.Path]::GetDirectoryName($(MSBuildProjectDirectory)))</RootFolder>
</PropertyGroup>
<Message Text="RootFolder: '$(RootFolder)'" />

这是一个VS 2010项目还是2008? - Brian Kretzler
这样做不会只是返回项目目录吗?与使用 $(MSBuildProjectDirectory) 本身一样? - Ritch Melton
1
不,System.IO.Path 不知道你传入的是文件夹路径还是文件路径,它视其为相同。我传入了一个文件夹的完整路径,它会将最底级的文件夹剥离出来,认为那是文件名,并返回上层文件夹。你可以试一下! - Brian Kretzler
3
@Spider M9 - 我本愿意,但我现在身处另一个国家的森林中,使用带有512k带宽的SDN-M通过SSH/SOCKS隧道传输,并且系统是以发电机为能源。 - Ritch Melton
由于某种原因,该路径以空格结尾返回,尽管现在可以使用trim(),但似乎无法在该属性上使用它,所以我选择了以下方式... <RootFolderDirty>$([System.IO.Path]::GetDirectoryName($(MSBuildProjectDirectory))) </RootFolderDirty> <RootFolder>$(RootFolderDirty.trim())</RootFolder> <OutputFolder>$(RootFolder)\output</OutputFolder> - samaspin
显示剩余3条评论

1
你发布的问题已经有了答案,而且看起来是一个不错的答案。MSBuild是建立在项目而非解决方案之上的,因此要找到一些能够为你提供解决方案路径的东西需要进行一些自定义。有一个事实需要考虑,即对于许多项目,解决方案文件并不位于项目树(或者在 MSBuild 术语中所说的“cone”)的根目录下。 MSBuild 保留属性

这给了我路径C:\GIT\NAntTest\build,我希望C:\GIT\NAntTest作为一个属性,这样我就可以将其作为所有相对URL的起始块来使用。 - samaspin
BAMBAM - 哦,你想要完整的解决方案路径!明白了。(假设项目与解决方案相关)。 - Ritch Melton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接