案例:当我从 MSBuild(使用 VS Build Tools 2017)构建时,我没有从主 msbuild 文件中获得 $(ExtensionTasksPath) 变量的任何值,当我使用集成的 VS MSBuild 构建时,值从主文件传递到 MSBuild.ExtensionPack。任务,这是预期的行为,为什么会发生?为了测试特定情况,我不使用任何属性。
1 回答
这是预期的行为,为什么会发生?
我认为这不是我们所期望的。当我在 VM 上测试时,来自 VS Build Tools2017 的 msbuild 获得的值与我们在 VS IDE 中的 msbuild 中获得的值相同。
由于这种行为,我有一些建议可以帮助解决问题:
1.首先,确保两个场景都构建成功。
2.如上所述,您在单独的VM中运行它们,确保被测试的两个文件是相同的并且是整个解决方案文件夹。(解决方案目录下的包文件夹有意义)
3.检查.xxproj文件,检查是否存在<Import Project="..\packages\MSBuild.Extension.Pack.1.9.1\build\net40\MSBuild.Extension.Pack.targets" ...>
我发现$(ExtensionTasksPath)
属性是在MSBuild.Extension.Pack.targets
文件中定义的,并且这个文件是通过<Import>
标签导入到 .xxproj 文件中的。
看看下面我的示例项目中的图片,它通过 nuget 安装了 MSBuild.Extension.Pack:
在我的项目安装扩展 bu nuget 后,csproj 文件中有一个 Import 语句,打开它我们可以找到:
此处定义的 $(ExtensionTasksPath) 的值。所以我猜你可能在目标文件或导入语句中丢失了某物,或者某物损坏了这个属性。
总之:
1.保留整个解决方案文件夹可能是最好的建议。2.如果它不起作用,在你的 .xxproj 文件中添加一个脚本就可以了:
<PropertyGroup>
<ExtensionTasksPath> Absolute path of your MSBuild.ExtensionPack.dll</ExtensionTasksPath>
</PropertyGroup>
它将覆盖标记中的值,无论您将程序集放在哪里,只需添加绝对路径即可。我的回答很有帮助,请给我反馈。任何更新请随时与我联系。