Visual Studio 2017 版项目不需要引用。新旧项目文件语法

Visual Studio 2017 build of project doesn't require references. New vs Old project file syntax

两个版本的项目文件似乎导致 VS2017 (MSBUILD 15.0) 构建的行为不同。在第一个项目文件案例中(较新的样式?),我实际上不必添加所有依赖项。通常在代码文件中,当您执行 "using something" 时,您必须在项目中包含对 "something" 的引用。但不适用于下面的 Project File 1 样式。我可以通过 "using" 在我的代码文件中包含对不在项目引用中的内容的引用。 Visual Studio 会很好地构建它。但是当我 运行 命令行 msbuild 时,缺少引用会导致构建失败。这种失败是我在使用第二种 项目文件 2 时也会在 Visual Studio 中遇到的传统问题。 IE。传统的"sorry, but if you are 'using' something you need a reference in your project"。 Visual Studio 101 自什么... 2003 年?

所以,Visual Studio 在某种程度上变得更聪明了。在某种程度上,我认为这里打破了基本的有效规则,但无论如何。

当我查看构建的诊断(即最详细的)输出时,很明显存在一些差异。一方面,输出格式不同(新样式在变量和值之间使用伪制表符,格式更好一些)。它也显然有稍微不同的 environment/whatever 变量。例如,"Resolve*" 值集的值略有不同。我只是假设 VS 正在设置一些导致 msbuild 行为不同的环境变量(我在输出中看不到任何命令行参数)。所有的 msbuild 工具和 VS 版本的东西看起来都一样。

那么,如何使 VS 和 msbuild 的行为相同?是否有特定的环境变量或命令行参数让 msbuild 与 VS 一样 "smart"?还是告诉VS按照传统规则行事?还是我必须重做我所有的项目文件才能成为旧版本?

项目文件 1:(较新的样式?)

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net4.6.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <ProjectReference Include="blah" />

项目文件 2:(traditional/older 样式)

<?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>

我明白了。它是不同的项目文件。较新的

<Project Sdk="Microsoft.NET.Sdk">

导致 VS 执行生成这些的还原

PS F:\Depots\blah\Source\obj> ls

Debug
project.assets.json
blah.csproj.nuget.cache
blah.csproj.nuget.g.props
blah.csproj.nuget.g.targets

恢复神奇地将所有 DLL 放入目标文件夹,因此构建工作正常。

在 new/fresh、VS 之前的构建中,该内容不存在并且 msbuild 失败。