【问题标题】:How do I find the current file in MSBuild如何在 MSBuild 中找到当前文件
【发布时间】:2012-01-08 08:19:28
【问题描述】:

我知道最新出版的关于 MSBuild 的书说这是不可能的,但我确信我已经看到了指向当前文件的属性。

有人知道找到当前文件的方法吗? (即当主 MSBuild 文件导入辅助文件时。从该文件内部到辅助文件的路径是什么。)

我正在尝试在 HKEY_LOCALMACHINE\Software\Microsoft\VisualStudio\8.0\MSBuild\SafeImports 中注册我的文件,但文件的路径在我的每台同事计算机上都不是恒定的,它是从几个不同的项目导入的硬编码的相对路径也不是一个好主意。

如果有办法获取当前工作目录也可以工作(工作目录会随着每次导入而切换,我想我可以将其保存)

【问题讨论】:

    标签: msbuild


    【解决方案1】:

    没有可靠的方法来识别“当前文件”。当 MSBuild 处理一个文件时,它可以导入多个其他文件,最终结果是该文件在内存中的单个完整表示。当目标执行时,它们不知道它们是在哪个文件中声明的。

    这就是为什么可重复使用的构建脚本必须“参数化”以接受已知相对位置的位置。例如,如果您依赖于 3rd 方引用的文件夹所在的位置,则驱动该过程的构建脚本必须为您声明该属性。

    仅限 MSBuild 4.0

    如果您使用的是 MSBuild 4.0,即 Visual Studio 2010/.NET 4.0(可以针对 .NET 2.0/3.0/3.5)。然后,您现在拥有可用于此特定目的的这些属性:

    • MSBuildThisFile
    • MSBuildThisFileDirectory
    • MSBuildThisFileDirectoryNoRoot

    赛义德·易卜拉欣·哈希米

    我的书:Inside the Microsoft Build Engine : Using MSBuild and Team Foundation Build

    【讨论】:

    • 我害怕那个。我记得在你的书中读过这个,但我也认为我看到了一个可以告诉我当前文件的属性。或者,我希望有一种方法可以保存工作目录(因为每次导入都会改变)。嗯,我只会传入一个值,说明文件是,我只是不想有外部依赖。
    • 是的,这可能是问题。为了缓解这种情况,您可以在验证目标中断言您的假设。因此,如果未填充该属性,只需抛出一个错误,说明它是必需的。我在第 7 章中写过。
    • 请注意,对于 MSBuild 4.0,这不再是问题。请参阅下面 user8657 的回答。
    【解决方案2】:

    在 4.0+ 中,您可以使用诸如 $(MSBuildThisFile) 之类的属性来执行此操作。见here

    【讨论】:

    • “MSBuild 保留属性”(简称 HERE)- 没有 MSBuildThisFile 属性
    • 错误。 MSDN 上的文档中缺少它,但有人在底部的用户注释中提供了一堆额外的缺失属性。
    猜你喜欢
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 2019-12-04
    相关资源
    最近更新 更多