Шаблон веб-проекта ASP.NET содержит 2 записи для импорта Microsoft.WebApplication.targets $ VSToolsPath) vs $ (MSBuildExtensionsPath32) - PullRequest
0 голосов
/ 25 апреля 2018

Я использую Visual Studio 2017 (версия 15.6.6) с .NET Framework версия 4.7.02558 (MSBuild версия 15.5.x), также известные как последние обновления на момент написания этой статьи.Когда я создаю веб-проект ASP.NET с использованием шаблона по умолчанию, результирующий файл .csproj содержит следующий фрагмент:

<PropertyGroup>
  <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
  <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
</PropertyGroup>
[...]
<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" Condition="false" />

Как видно, файл Microsoft.WebApplication.targets импортируется дважды.Я чешу голову над этим блоком .csproj:

  • Во-первых, 2-я запись отключена из-за Condition = "false" (я что-то здесь упускаю?)вопрос, в чем вообще дело с этим оператором импорта?
  • Второй из всех 2-х операторов указывает на v10.0 вместо v15.0.Errrr woOt?Разве это не должно быть v15.0?
  • Треть всего этого бита:

    < VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0< / VisualStudioVersion>
    

    , вероятно, должно быть:

    < VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">15.0< /VisualStudioVersion>
    

В целях тестирования я закомментировал первый оператор и включил второй, например, так:

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v15.0\WebApplications\Microsoft.WebApplication.targets" Condition="true" />

Кажется, что это прекрасно работает как на моей машине разработчика, так и на сервере без головы CI, который у нас есть.Я упоминаю об этом, потому что, если используется значение по умолчанию \ v10.0 \, система сборки ломается очень эзотерически в будущем:

На нашем CI-сервере механизм веб-публикации молча не может порождать что-либов выходной папке и в то же время не выдает никакой ошибки (gah!).

Это известная проблема, которая, похоже, затрагивает многих пользователей.Ознакомьтесь с ответом rianjs здесь:

https://github.com/Microsoft/msbuild/issues/1901

Он пришел к тому же выводу, что и я.Я не могу понять, почему шаблон по умолчанию для VS17 не имеет встроенных положений для решения таких тонкостей в системе сборки по умолчанию, как показано выше.

Все эти настройки по умолчанию .csproj кажутся совсем не подходящими, полностьювводить в заблуждение и представлять собой батарейки для всевозможных странных, молчаливых и трудноразличимых ошибок.Особенно, когда речь идет о CI-серверах.

Чтобы решить эти проблемы с помощью шаблонов по умолчанию, нужно ли обновлять шаблоны Visual Studio отдельно через дополнение или что-то, чтобы получить здоровые шаблоны для VS17?Что здесь происходит?

1 Ответ

0 голосов
/ 26 апреля 2018

Шаблон веб-проекта ASP.NET содержит 2 записи для импорта Microsoft.WebApplication.targets $ VSToolsPath) vs $ (MSBuildExtensionsPath32)

Устранить эту проблему непросто, потому что существует множество причин этой проблемы, серверная среда, расширение Visual Studio, некоторые пакеты nuget и так далее. Я хотел бы высказать некоторые соображения по этому вопросу.

Согласно вашему описанию, если вы закомментировали первый оператор и включили второй, вы можете успешно построить его на сервере сборки. Так что, похоже, переменная VSToolsPath не работает в первом операторе.

Когда мы откроем файл проекта .csproj с помощью блокнота, мы увидим следующий импорт:

  <PropertyGroup>
    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
  </PropertyGroup>
  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
  <Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />
  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" Condition="false" />

Вы можете успешно построить с <Import Project="...\v15.0\WebApplications\Microsoft.WebApplication.targets" Condition="true" />, но потерпели неудачу с шаблоном по умолчанию, очевидно, значение $(VSToolsPath) не является правильным или нулевым в первом операторе, а значение $(VSToolsPath) зависит от значения $(VisualStudioVersion) , $(VisualStudioVersion) определен в файле Microsoft.VisualStudioVersion.v15.Common.props:

  <PropertyGroup>
    <VisualStudioVersion>15.0</VisualStudioVersion>
    <VSToolsPath>$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
  </PropertyGroup>

</Project>

Расположение этого файла: C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0

Итак, если первое утверждение не импортировано правильно,

first , проверьте, существует ли файл Microsoft.VisualStudioVersion.v15.Common.props на вашем сервере сборки

Второй , проверьте, вызываете ли вы MSBuild из Visual Studio 2017: C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin.

Третий , проверьте, установлен ли в вашем проекте какой-либо другой nuget, например, Microsoft.VSSDK.BuildTools, Расширение Visual Studio 2017 - VSToolsPath не работает .

Если все вышеперечисленное не поможет вам, обходной путь заключается в создании пользовательского шаблона проекта с оператором:

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v15.0\WebApplications\Microsoft.WebApplication.targets" Condition="true" />

Надеюсь, это поможет.

...