Были включены повторяющиеся элементы «Содержимое». .NET SDK по умолчанию включает элементы Content из каталога вашего проекта.

132

Всякий раз, когда я добавляю файл javascript или css в свой основной проект asp.net и выполняю его dotnet runв своем терминале bash, я получаю следующую ошибку:

/usr/share/dotnet/sdk/1.0.1/Sdks/Microsoft.NET.Sdk/build/Microsoft

.NET.Sdk.DefaultItems.targets (188,5): ошибка: были включены повторяющиеся элементы «Содержимое». .NET SDK по умолчанию включает элементы Content из каталога вашего проекта. Вы можете удалить эти элементы из файла проекта или установить для свойства EnableDefaultContentItems значение false, если вы хотите явно включить их в файл проекта. Для получения дополнительной информации см. Https://aka.ms/sdkimplicititems . Повторяющиеся элементы были: wwwroot / css / BasicQuotation.css; 'wwwroot / js / BasicQuotation.js' [/mnt/c/Dev/myproject/MyProject/MyProject.csproj]

Сборка не удалась. Исправьте ошибки сборки и запустите снова.

Я могу исправить это, удалив ItemGroupиз моего файла csproj, но я не думаю, что это очень продуктивно.

Это происходит в шаблоне веб-приложения ASP.NET Core (.NET Core) Visual Studio 2017 по умолчанию. Я добавляю файлы в свой проект, щелкнув правой кнопкой мыши папку wwwroot> js и выбравAdd > New Item > JavaScript File

Это мой файл .csproj:

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

  <PropertyGroup>
    <TargetFramework>netcoreapp1.1</TargetFramework>
  </PropertyGroup>

  <PropertyGroup>
    <PackageTargetFallback>$(PackageTargetFallback);portable-net45+win8+wp8+wpa81;</PackageTargetFallback>
  </PropertyGroup>

  <PropertyGroup>
    <UserSecretsId>aspnet-MyProject-7e1906d8-5dbd-469a-b237-d7a563081253</UserSecretsId>
  </PropertyGroup>

  <ItemGroup>
    <Compile Remove="wwwroot\lib\jquery-validation\**" />
    <Content Remove="wwwroot\lib\jquery-validation\**" />
    <EmbeddedResource Remove="wwwroot\lib\jquery-validation\**" />
    <None Remove="wwwroot\lib\jquery-validation\**" />
  </ItemGroup>

  <ItemGroup>
    <Content Include="wwwroot\css\BasicQuotation.css" />
    <Content Include="wwwroot\js\BasicQuotation.js" />
  </ItemGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore" Version="1.1.1" />
    <PackageReference Include="Microsoft.AspNetCore.Authentication.Cookies" Version="1.1.1" />
    <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="1.1.1" />
    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="1.1.2" />
    <PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="1.1.1" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="1.1.1" PrivateAssets="All" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="1.1.1" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer.Design" Version="1.1.1" PrivateAssets="All" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="1.1.0" PrivateAssets="All" />
    <PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="1.1.1" />
    <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="1.1.1" />
    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="1.1.0" PrivateAssets="All" />
  </ItemGroup>
  <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="1.0.0" />
    <DotNetCliToolReference Include="Microsoft.Extensions.SecretManager.Tools" Version="1.0.0" />
    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="1.0.0" />
  </ItemGroup>
  <ItemGroup>
    <Folder Include="Data\Commands\" />
    <Folder Include="Data\Queries\" />
    <Folder Include="wwwroot\images\" />
  </ItemGroup>

</Project>
Джао
источник
13
Если вы столкнулись с этой проблемой после обновления VS2017 до v15.3, обязательно загляните сюда . MS решила включить определенные папки, такие как wwwroot, по умолчанию, что означает, что они, вероятно, включены дважды.
Джао
Статья, которой поделился @jao, очень хорошо объясняет, почему это происходит и как это исправить. Просто перейдите к этой статье.
Пепито Фернандес

Ответы:

107

Итак, я столкнулся с той же проблемой. Я не хотел отключать DefaultCompileItems, потому что знал, что это не «решит» проблему. Итак, я выгрузил свой проект, открыл файл .csproj в текстовом режиме в Visual Studio и увидел это.

<ItemGroup>
    <Content Include="wwwroot\css\custom-bootstrap-navbar.css" />
    <Content Include="wwwroot\images\friends-eating\image1.jpg" />
    <Content Include="wwwroot\images\friends-eating\image2.jpg" />
    <Content Include="wwwroot\images\friends-eating\image3.jpg" />
</ItemGroup>
<ItemGroup>
    <Folder Include="wwwroot\images\friends-eating\" />
</ItemGroup>

Когда я закомментировал первый блок ItemGroup, он сработал. Я предполагаю, что происходит то, что проект добавляет всю папку \ images \ friends-eat \, а затем добавляет каждое отдельное изображение, вызывая дублирование.

Что касается пользовательских css и js, проект автоматически добавляет wwwroot \ css и wwwroot \ js, поэтому, если у вас есть добавленный отдельный файл (например, wwwroot \ css \ custom-bootstrap-navbar.css), он будет считаться дубликатом.

Pinski
источник
Это <Folder Include="wwwroot\" />работает для меня, но visual studio отменит это позже :(
Jaider 01
3
Хорошо, я не понимаю. Что, черт возьми, на самом деле делает visual studio и почему?
tnk479
194
1. Click 'Show All Files' in Solution Explorer
2. Right-click over 'wwwroot' select 'Exclude From Project'
3. Right-click over 'wwwroot' select 'Include in Project'
Dzhefer
источник
3
Это решило проблему для меня, но что на самом деле заставило ее работать?
Роно
@Rono Похоже, он явно определяет все файлы в вашем файле wwwroot в файле .csproj. например: i.imgur.com/4SPnQ5h.png
J. Schei
4
Сработал и для меня - и, на мой взгляд, это гораздо более безопасный способ, чем принятый ответ.
brinch
У меня тоже сработало! Отключение DefaultContentItems помогло создать мое решение, но изображения, CSS и другие файлы не отображались.
Бруно Серрано
1
После исключения wwwroot вам, возможно, придется нажать кнопку «Показать все файлы» (которая выглядит как 3 беспорядочно сложенных листа бумаги) в верхней части обозревателя решений, чтобы увидеть папку «wwwroot» и добавить ее обратно. дюйм. Моя исчезла, и я не знал, как ее вернуть, пока не нашел эту кнопку. Папка будет отображаться серым цветом, что означает, что ее нет.
Джеймс Туми
25

Это сработало в моем случае:

 <PropertyGroup>
    ...
    <EnableDefaultContentItems>false</EnableDefaultContentItems>
  </PropertyGroup>
harveyt
источник
3
Как указано в моем комментарии к ответу Пинки, я бы не предлагал это в качестве решения, поскольку это может привести к большему количеству ошибок.
Мэтт
На самом деле я столкнулся с более серьезными проблемами, установив для этого параметра значение false. Я бы также рекомендовал не устанавливать для него значение false.
Rwiti 07
Каков самый простой способ включить папку полностью как элементы EmbeddedResource?
Джон Заброски
После этого wwwroot больше не использовался. Так что лучше не используйте это ...
UNeverNo
14

Это случилось, когда я только что обновил свой проект с .NET Core 1.X до 2.0. Вот мое решение.

  • Откройте xxx.csproj или щелкните проект правой кнопкой мыши.
  • Выгрузить проект
  • Отредактируйте xxx.csproj.

Затем удалите элементы ItemGroup, начинающиеся с <Content Include = "wwwroot\xxxxx"

wtf512
источник
Спасибо! Примечание. Похоже, это связано с последней версией Visual Studio 15.3, а не напрямую с .NET Core 2.0
Винсент В.
10

Мои проблемы были близки, но не то же самое. Моя ошибка заключалась в следующем:

C: \ Program Files \ dotnet \ sdk \ 2.0.0-preview2-006497 \ Sdks \ Microsoft.NET.Sdk \ build \ Microsoft.NET.Sdk.DefaultItems.targets (285,5): ошибка: повторяющиеся элементы «Содержимое» были включены. .NET SDK по умолчанию включает элементы Content из каталога вашего проекта. Вы можете удалить эти элементы из файла проекта или установить для свойства EnableDefaultContentItems значение false, если вы хотите явно включить их в файл проекта. Для получения дополнительной информации см. Https://aka.ms/sdkimplicititems . Повторяющиеся элементы были: wwwroot \ js \ KOBindings.js; 'Wwwroot \ JS \ KOPleaseWait.js'; 'Wwwroot \ JS \ ProjectTime \ Add.js'; 'Wwwroot \ JS \ TimeAdmin \ Invoice.js'; 'wwwroot \ js \ TimeAdmin \ PayPeriodTotals.js' [C: \ Avantia Projects \ Time Card \ avantia-timesheet \ Solution \ Almanac \ Almanac.

Если бы я сделал это:

<EnableDefaultContentItems>false</EnableDefaultContentItems>

Он не будет компилироваться, так как внезапно Areasне будет распознан.

Мое решение кажется странным, но в сообщении говорится, что были дубликаты файлов:

Повторяющиеся элементы были: wwwroot \ js \ KOBindings.js; 'Wwwroot \ JS \ KOPleaseWait.js'; 'Wwwroot \ JS \ ProjectTime \ Add.js'; 'Wwwroot \ JS \ TimeAdmin \ Invoice.js'; 'Wwwroot \ JS \ TimeAdmin \ PayPeriodTotals.js'

Глядя на мой .csprojфайл:

<ItemGroup>
  <Content Include="pdf.js" />
  <Content Include="wwwroot\js\package.json" />
  <Content Include="wwwroot\js\pdf.js" />
  <Content Include="wwwroot\js\KOBindings.js" />
  <Content Include="wwwroot\js\KOPleaseWait.js" />
  <Content Include="wwwroot\js\ProjectTime\Add.js" />
  <Content Include="wwwroot\js\TimeAdmin\Invoice.js" />
  <Content Include="wwwroot\js\TimeAdmin\PayPeriodTotals.js" />
</ItemGroup>

Это было ЕДИНСТВЕННОЕ место во всем проекте, где эти файлы были ссылками (помимо того, где они были загружены). Так что фраза « дублировать» не имеет для меня никакого смысла. Однако, комментируя эти файлы как таковые, я решил мою проблему:

<ItemGroup>
  <Content Include="pdf.js" />
  <Content Include="wwwroot\js\package.json" />
  <Content Include="wwwroot\js\pdf.js" />
  <!--
    <Content Include="wwwroot\js\KOBindings.js" />
    <Content Include="wwwroot\js\KOPleaseWait.js" />
    <Content Include="wwwroot\js\ProjectTime\Add.js" />
    <Content Include="wwwroot\js\TimeAdmin\Invoice.js" />
    <Content Include="wwwroot\js\TimeAdmin\PayPeriodTotals.js" />
  -->
</ItemGroup>

Я предполагаю, что это как-то связано с тем, 2.0.0-preview2-006497что я недавно установил.

Также в этой ссылке упоминаются разговоры о глобусах. Но не говорит мне, где это. Он говорит о SDK и тому подобном. Но ответом были мои собственные .jsфайлы. Эту ссылку нужно обновить или расширить ИМХО. Надеюсь, это кому-то поможет.

Grandizer
источник
Хотел бы знать, почему это работает. Однако у меня просто сработало. =)
Frog Pr1nce
10

Как говорится в ссылке , вы можете отключить это поведение (автоматическое включение) и явно включить весь контент, добавив это в свой csprojфайл:

<PropertyGroup>
    <EnableDefaultContentItems>false</EnableDefaultContentItems>
</PropertyGroup>
Дмитрий
источник
1
Когда я добавить , что в мой файл csproj и я удалить CSS / Js ItemGroup, я получаю следующее сообщение об ошибке:CSC : error CS5001: Program does not contain a static 'Main' method suitable for an entry point [/mnt/c/Dev/myproject/MyProject/MyProject.csproj] The build failed. Please fix the build errors and run again.
Джао
2
«Контент», а не «Компиляция» - не так ли?
Harveyt 05
Одно примечание ... если вы явно не включите свою папку Views, она не будет публиковать ваши просмотры с этим параметром
saluce
Я пробовал это, но это не сработало. все еще получаю ту же ошибку
pantonis
3

В моем случае я решил это, удалив все файлы из wwwroot-Directory в VS. Выгрузите и перезагрузите проект. Скопируйте все файлы обратно с помощью VS. Готово

Алекс Фройнд
источник
Ни одно из лучших решений не помогло мне. Я сделал это до того, как прочитал ваш комментарий, и это работает безупречно !!! Я исключил wwwroot, контроллеры, папки просмотра и добавил их обратно, и теперь все работает нормально!
revobtz
2

На самом деле, ядро Asp.net автоматически включать содержание wwwroot\css\, wwwroot\js\и wwwroot\lib\расположение, поэтому , несмотря на это , если ваш csprojфайл явным образом включить содержимое из этих каталогов , то те , содержание будет дублироваться поэтому удаление содержимого из вас csprojфайла это лучший способ избавиться от этой ошибки. Поэтому удалите содержимое ниже -

  <ItemGroup>
    <Compile Remove="wwwroot\lib\jquery-validation\**" />
    <Content Remove="wwwroot\lib\jquery-validation\**" />
    <EmbeddedResource Remove="wwwroot\lib\jquery-validation\**" />
    <None Remove="wwwroot\lib\jquery-validation\**" />   
 </ItemGroup>

  <ItemGroup>
    <Content Include="wwwroot\css\BasicQuotation.css" />
    <Content Include="wwwroot\js\BasicQuotation.js" />   
  </ItemGroup>
Mostafiz
источник
1
Это случилось со мной при обновлении Visual Studio до 15.3. Чтобы предотвратить критические изменения для моих коллег, которые еще не обновились, мне пришлось добавить <PropertyGroup> <EnableDefaultContentItems>false</EnableDefaultContentItems> </PropertyGroup>в файл .csproj.
saluce
@saluce да, вы правы, то же решение, которое вы можете использовать и в своем контексте. выбор зависит от разработчика, хочет он оставить EnableDefaultContentItemsили нет. Это два разных подхода
Мостафиз
Я хотел сказать, что единственное изменение, которое я сделал, - это обновление Visual Studio до 15.3. Я не вносил изменений в свой проект, но до обновления этот параметр не требовался.
saluce
2

В моем случае я отключил оба элемента ниже по умолчанию.

<EnableDefaultContentItems>false</EnableDefaultContentItems>
<EnableDefaultItems>false</EnableDefaultItems>
Дуй Хоанг
источник
1

Не то чтобы я мог видеть это в вашем примере выше, чтобы помочь другим искателям ТАК ..

Вы также можете получить эту ошибку, если один и тот же файл дважды указан в <Content Include="xxx" />элементах вашего csprojфайла.

Удалите дубликат и перестройте.

Сэм
источник
1

В Visual Studio 2017 15.3 с .NET Core 2.0 EnableDefaultCompileItems у меня не работал.

Мне нужно было добавить это в мой .csproj

  <PropertyGroup>
    <EnableDefaultContentItems>false</EnableDefaultContentItems>
  </PropertyGroup>
Kyriacos
источник
Для меня (Visual Studio 15.3.4 .NET framework 4.5.2) EnableDefaultContentItems не работал, а EnableDefaultCompileItems работал.
hlovdal
1

Я нашел другое подходящее решение.

  1. Щелкните правой кнопкой мыши свой проект mvc и выберите Изменить csproj.
  2. Если вы добавляете файлы под wwwroot, просто переместите их в папку под wwwroot, скажем, «тема»

И удалите все теги содержимого в файле csproj, если они существуют, например;

<Content Include="wwwroot\theme\favicon.ico" />
<Content Include="wwwroot\theme\fonts\cyrillic-ext400.woff2" />
<Content Include="wwwroot\theme\fonts\cyrillic-ext700.woff2" />

И только добавьте это;

  <ItemGroup>
    <Folder Include="wwwroot\theme\" />
  </ItemGroup>

Итак, файл csproj должен выглядеть так:

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

      <PropertyGroup>
        <TargetFramework>netcoreapp1.1</TargetFramework>
      </PropertyGroup>

      <PropertyGroup>
        <PackageTargetFallback>$(PackageTargetFallback);portable-net45+win8+wp8+wpa81;</PackageTargetFallback>
      </PropertyGroup>

      <ItemGroup>
        <Folder Include="wwwroot\theme\" />
      </ItemGroup>
      <ItemGroup>
        <PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.0.0" />
...

Таким образом, я думаю, вы добавляете все файлы в папку темы. Поэтому не включайте их по одному, так как это может привести к ошибкам.

Lost_In_Library
источник
1

Проекты .NET Core

Если вы находитесь в библиотеке классов, возможно, вам потребуется удалить все элементы Compile / Content из вашего csproj, поскольку они включаются автоматически.

<Project Sdk="Microsoft.NET.Sdk">    
  <PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
  </PropertyGroup>
  <!-- NEEDED -->
  <ItemGroup>
    <ProjectReference />
    <ProjectReference />
  </ItemGroup>
  <!-- NOT NEEDED -->
  <ItemGroup>
   <Compile Include="Models\ExampleClass.cs" />
   <Content ... />
  </ItemGroup>
</Project>
Разван Думитру
источник
0

Исключение и включение обратно папок с ошибкой дубликатов сработали для меня! Надеюсь, это поможет кому-то другому!

revobtz
источник
0

Я думаю, что отключение EnableDefaultContentItems - не лучший вариант. cs-ProjРедактирование файлов вручную тоже не лучшая идея.

Итак, для нашего конвейера сервера сборки мы написали очень маленький инструмент, который автоматически удалит все повторяющиеся записи: dotnet-csproj-cleaner

Мы запускаем его под Docker в качестве первого шага сборки в нашем конвейере непрерывной интеграции.

anakod
источник
Выглядит неплохо, но почему он ограничен проектами с wwwroot-путем?
Джон Заброски
Это стандартное расположение содержимого VS, и его путь включен по умолчанию. Если вам нужно более сложное решение - отправьте запрос на перенос. Это должно быть очень просто, добавив дополнительные аргументы командной строки. Спасибо.
anakod
0

У меня была такая же проблема только с файлом, а все остальные работали (все мои шаблоны хранились прямо в wwwroot / content). Проект создавался не мной, поэтому я не знаю многих деталей.

Проблема была устранена переименованием файла с ошибкой туда и обратно :

MyTemplate.html - переименован -> MyTemplate2.html - переименован -> MyTemplate.html

Примечание : при первом переименовании у меня возникла ошибка типа « конфигурация содержимого не найдена », но второе переименование прошло без проблем.

После этого мне удалось успешно скомпилировать проект.

Разван
источник