如何在MSBuild中找到当前文件

如何在MSBuild中找到当前文件,msbuild,Msbuild,我知道MSBuild上最新的一本书说这是不可能的,但我确信我看到了一个指向当前文件的属性 有人知道找到当前文件的方法吗?(即主MSBuild文件导入辅助文件时。从该文件内部到辅助文件的路径是什么。) 我试图在HKEY_LOCALMACHINE\Software\Microsoft\VisualStudio\8.0\MSBuild\SafeImports中注册我的文件,但在我的每个同事的计算机上,该文件的路径不是恒定的,它是从几个不同的项目导入的,因此使用硬编码的相对路径也不是一个好主意 如果有一

我知道MSBuild上最新的一本书说这是不可能的,但我确信我看到了一个指向当前文件的属性

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

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


如果有一种方法可以获取当前的工作目录,该目录也可以工作(每次导入时工作目录都会切换,我想我可以将其保存下来)

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

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

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

  • MSBuildThisFile
  • MSBuildThisFileDirectory
  • MSBuildThisFileDirectoryNoRoot
赛义德·易卜拉欣·哈希米


我的书:

在4.0+中,您可以使用类似$(MSBuildThisFile)的属性来完成此操作。看

我很害怕。我记得在你的书中读到过这个,但我还以为我看到了一个属性,可以告诉我当前的文件。或者,我希望有一种方法可以保存工作目录(因为每次导入都会改变)。好吧,我只需要传入一个值,该值表示文件是,我只是不想有外部依赖性。是的,这可能是个问题。为了避免这种情况,您可以在验证目标中声明您的假设。因此,如果属性未填充,只需抛出一个错误,说明它是必需的。我在第7章中提到了这一点。请注意,对于MSBuild 4.0,这不再是一个问题。请参阅下面由用户8657提供的答案。“MSBuild保留属性”(此处称为)-不具有MSBuildThisFile属性。MSDN上的文档中缺少它,但有人在底部的用户说明中提供了一些额外的缺少的属性。