【发布时间】:2020-05-27 18:58:40
【问题描述】:
两个版本的项目文件似乎会导致 VS2017 (MSBUILD 15.0) 构建的行为不同。在第一个项目文件案例(较新的样式?)中,我实际上不必添加所有依赖项。通常在代码文件中,当您“使用某物”时,您必须在项目中包含对“某物”的引用。但不适用于下面的这种 Project File 1 样式。我可以通过“使用”我的代码文件中的引用来包含不在项目引用中的内容。 Visual Studio 会很好地构建它。但是当我运行命令行 msbuild 时,缺少的引用会导致构建失败。这个失败是我在使用第二种类型的 Project File 2 时也会在 Visual Studio 中遇到的传统问题。 IE。传统的“对不起,但如果你正在‘使用’某些东西,你需要在你的项目中引用”。 Visual Studio 101 自什么... 2003?
因此,Visual Studio 在某种程度上变得更加智能。我认为在某种程度上打破了这里的基本 effing 规则,但无论如何。
当我查看构建的诊断(即最详细的)输出时,很明显存在一些差异。一方面,输出格式不同(新样式在变量和值之间使用伪标签更好地格式化事物)。它也显然具有略微不同的环境/任何变量。例如,它的“Resolve*”值集的值略有不同。我只是假设 VS 正在设置一些环境变量(我在输出中看不到任何命令行参数),这导致 msbuild 行为不同。所有的 msbuild 工具和 VS 版本的东西看起来都一样。
那么,我如何使 VS 和 msbuild 的行为相同?是否有特定的环境变量或命令行参数可以让 msbuild 像 VS 一样“智能”?还是告诉 VS 按照传统规则行事?还是我必须重做所有项目文件才能成为旧版本?
项目文件 1:(较新的样式?)
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net4.6.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="blah" />
项目文件 2:(传统/旧式)
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
...snip...
ItemGroup>
<ProjectReference Include="blah2">
<Project>{GUID SNIPPED}</Project>
<Name>blahs</Name>
【问题讨论】:
标签: .net visual-studio msbuild