在 TFS 构建服务器上的 before.Solution.sln.targets 脚本 运行 中使用来自 NuGet 的 MSBUILDTASKS 时无法获得正确的 MSBuildCommunityTasksPath

Unable to get correct MSBuildCommunityTasksPath when using MSBUILDTASKS from NuGet in a before.Solution.sln.targets script run on TFS build server

我一直在项目级目标文件中成功使用 MSBUILDTASKS(从 NuGet 安装),运行 在 TFS 构建服务器上,很长一段时间。现在,我正尝试在解决方案级前后目标文件 (see here) 中使用它。

但是,以这种方式使用,它似乎无法形成 MSBuild.Community.Tasks.dll 的正确路径,如我的目标文件中的 MSBuildCommunityTasksPath 属性 中指定的那样。

如果我这样设置:

<MSBuildCommunityTasksPath>$(SolutionDir)\.build</MSBuildCommunityTasksPath>

然后我得到这个错误:

D:\Builds\Agents\DevelopmentSTP1\My.Product\src\before.My.Product.sln.targets (9): 找不到导入的项目"D:\.build\MSBuild.Community.Tasks.Targets"。确认声明中的路径正确,并且该文件存在于磁盘上。

构建服务器上到 DLL 的实际路径是:D:\Builds\Agents\DevelopmentSTP1\My.Product\src\.build ,所以看起来 $(SolutionDir) 返回了一个空白,然而这使得没有意义,因为 $(SolutionDir) 在脚本的其他地方成功使用。

如果我这样设置:

<MSBuildCommunityTasksPath>$(SolutionDir).build</MSBuildCommunityTasksPath>(即没有反斜杠)

然后我得到这个错误:

D:\Builds\Agents\DevelopmentSTP1\My.Product\src\before.My.Product.sln.targets (18): "MSBuild.Community.Tasks.Attrib" 任务无法从程序集 D:\Builds\Agents\DevelopmentSTP1\My.Product\src\.build\.build\MSBuild.Community.Tasks.dll.无法加载文件或程序集 'file:///D:\Builds\Agents\DevelopmentSTP1\My.Product\src\.build\.build\MSBuild.Community.Tasks.dll' 或其依赖项之一。该系统找不到指定的文件。确认声明正确,程序集及其所有依赖项可用,并且任务包含实现 Microsoft.Build.Framework.ITask.[=16= 的 public class ]

现在路径差不多了,但是注意文件夹名称加倍:\.build\.build

我尝试了很多技巧来让它工作,比如添加 ..\ 试图让它退回到文件夹级别,但只要我保留 $(SolutionDir) 就没有任何效果多变的。唯一可行的是硬编码物理路径,即

<MSBuildCommunityTasksPath>D:\Builds\Agents\DevelopmentSTP1\My.Product\src\.build</MSBuildCommunityTasksPath>

有没有关于如何在不对路径进行硬编码的情况下使其工作的想法?

谢谢

感谢 Github 上的用户 VonOgre,我终于找到了答案。他说:

... msbuild 为解决方案发出的 metaproj 在定义 $(SolutionDir) 属性 之前导入 before..sln.targets ... before-解决方案目标在进行自己的导入时还没有 $(SolutionDir) 可用,导致空白,但后解决方案目标将......您可以考虑使用 $(MSBuildThisFileDirectory) 或 $(MSBuildProjectDirectory) 而不是 $(SolutionDir) ,因为这些是低级 MSBuild 属性。在这种情况下,任何一个都可以工作,因为 before/after..sln.targets 文件需要是解决方案文件的同级文件。

所以简短的回答是:不要在解决方案之前的目标文件中使用 $(SolutionDir) - 而是使用 $(MSBuildThisFileDirectory)。

https://github.com/loresoft/msbuildtasks/issues/268