Сборка проекта Visual Studio 2017 не требует ссылок. Синтаксис файла нового и старого проекта - PullRequest
0 голосов
/ 27 мая 2020

Две версии файлов проекта, похоже, приводят к разному поведению сборок VS2017 (MSBUILD 15.0). В первом случае файла проекта (более новый стиль?) Мне фактически не нужно добавлять все зависимости. Обычно в файле кода, когда вы «используете что-то», вы должны включить ссылку на «что-то» в проекте. Но НЕ с этим стилем Project File 1 ниже. Я могу включить с помощью «using» ссылку в свой файл кода на то, чего НЕТ в ссылках проекта. Visual Studio отлично его построит. Но затем, когда я запускаю командную строку msbuild, отсутствующая ссылка вызывает сбой сборки. Этот сбой является традиционным, что я также получил бы в Visual Studio при использовании второго типа Project File 2 . Ie. традиционное «извините, но если вы« используете »что-то, вам понадобится ссылка в вашем проекте». Visual Studio 101 с каких ... 2003?

Итак, Visual Studio как-то умнее. В некотором смысле, я думаю, что это нарушает основные c правила здесь, но неважно. что есть некоторые отличия. Во-первых, другой формат вывода (новый стиль немного лучше форматирует псевдо-вкладки между переменными и значениями). Он также явно имеет немного другую среду / любые переменные. Например, он имеет несколько другие значения для набора значений «Разрешить *». Я просто предполагаю, что VS устанавливает некоторые переменные среды (я не вижу никаких параметров командной строки в выходных данных), что приводит к другому поведению msbuild. Все инструменты msbuild и версии VS выглядят одинаково.

Итак, как мне заставить VS и msbuild работать одинаково? Есть ли конкретная переменная среды или аргумент командной строки, чтобы msbuild был таким же «умным», как VS? Или сказать VS вести себя в соответствии с традиционным правилом? Или мне нужно go повторить все мои файлы проекта, чтобы они были более старой версией?

Файл проекта 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>

1 Ответ

1 голос
/ 28 мая 2020

Я разобрался. Это разные файлы проекта. Более новые с этим

<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 в целевую папку, поэтому сборка работает.

В новой / fre sh сборке до VS этого материала нет, и msbuild завершается с ошибкой.

...