Для чего в файле .csproj значение <None Include = «…»>?

139

Как

<None Include="C:\foo.bar" />

отличный от

<Content Include="C:\foo.bar" />

?

Эммет
источник
7
Я Contentпоменял несколько s на Nones. Думаю, это произошло, когда я переименовал файлы из .ascx в .cshtml при преобразовании в Razor. Их изменение вручную устранило некоторые проблемы с развертыванием, которые у меня были. Рад, что нашел это.
Крис

Ответы:

138

Статья MSDN о свойстве действия сборки объясняет различия.

Нет - файл не входит в группу вывода проекта и не компилируется в процессе сборки. Примером является текстовый файл, содержащий документацию, например файл Readme.

Содержимое - файл не компилируется, но включается в группу вывода содержимого. Например, этот параметр является значением по умолчанию для файла .htm или другого типа веб-файла.

Адрианбэнкс
источник
5
Спасибо, мне не удалось найти эту ссылку.
Emmett
Полезно, но зачем вообще нужен пункт «Нет», если файл не должен быть включен в вывод? В чем смысл?
JimH44
1
Элементы @ JimH44 <Нет> часто используются для копирования файлов в выходной каталог, даже если по умолчанию они не входят в группу вывода . Если вы выберете «Копировать в выходной каталог» -> «Копировать всегда» для файла <Нет>, это приведет к его копированию, и вы увидите, что запись, добавленная в файл .csproj проекта, будет иметь запись <Нет>. для файла.
Conspicuous Compiler
3
Так в чем же разница между файлом <None> с «Копировать в выходной каталог» -> «Копировать всегда» и файлом <Content> с «Копировать в выходной каталог» -> «Копировать всегда»?
хеш-таблица
31

Одно отличие состоит в том, как они публикуются; «Нет» элементы не включаются в публикацию, в отличие от элементов «Содержимое»; например, в диалоговом окне «Файлы приложения» на вкладке «Опубликовать».

Марк Гравелл
источник
8
Не правда. По крайней мере, в новой точке net cli. если у вас есть элемент, объявленный как None с CopyToOutputDirectoryустановленным для trueнего набором, он будет опубликован вdotnet publish
disklosr
13

Я не уверен на 100% (я прочитал описание свойства Build Action в MSDN ), но простое копирование этого ответа из MSDN в StackOverflow не дает мне полного ответа на этот вопрос.

Разница между None и Content влияет только на веб-проекты. Для проекта командной строки, проекта WinForm или проекта UnitTest (в моем случае) и т. Д. None и Content не имеют разного поведения.

MSDN: «группа вывода проекта» или «группа вывода содержимого» - только термины, используемые в веб-проекте, верно?

hfrmobile
источник
2
Как вы говорите, кажется, что Nonevs Contentдействует только на этапе публикации, а не на этапе сборки . Кажется, что шаг сборки CopyToOutputDirectoryможет быть установлен на любом, и это контролирует, копируется ли файл на этапе сборки. Также кажется странным, что по умолчанию шаблоны T4 добавляются как Contentэлементы, а не Noneэлементы.
Кристофер Кинг,
8

В моей ситуации мой файл MSBuild имел ItemGroupресурсы изображений, которые выглядели следующим образом:

  <ItemGroup>
    <Content Include="Resources\image001.png" />
    <Content Include="Resources\image002.png" />
    <Content Include="Resources\image003.png" />
    <Content Include="Resources\image004.png" />
    <None Include="Resources\image005.png" />
    <None Include="Resources\image006.png" />
    <None Include="Resources\image007.png" />
  </ItemGroup>

В то время как мой проект строительства штрафа, это оставило мне интересно , почему у меня был смесь Contentи Noneэлементов типа детали в моем ItemGroup. Эта статья MSDN (для Visual Studio 2010) дала мне руководство, которое я искал:

Обратите внимание, что когда редактор ресурсов добавляет изображение, он устанавливает для действия сборки значение « Нет» , поскольку файл .resx ссылается на файл изображения. Во время сборки образ загружается в файл .resources, созданный из файла .resx. После этого к изображению можно легко получить доступ с помощью строго типизированного класса, автоматически созданного для файла .resx. Следовательно, не следует изменять этот параметр на « Встроенный ресурс» , поскольку это приведет к включению изображения в сборку два раза.

Решение. Следуя этому руководству, я изменил Contentэлементы типа элемента с помощью текстового редактора на None.

Кроме того, для обзора элементов MSBuild см. Эту статью MSDN .

DavidRR
источник
3

У меня есть проект, который не содержит компилируемых элементов (в нем хранятся html и javascript для модульных тестов jasmine).

Однажды мое решение (содержащее указанный проект) перестало компилироваться, говоря: «Целевой объект« Сборка »не существует в проекте».

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

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

Затем я изменил строку с

<None Include="SpecRunner.html" />

к

<Content Include="SpecRunner.html" />

и он работал и на сервере сборки.

cedd
источник
2

Вам не нужно None в файле проекта шаблона, чтобы включать файлы, которые вы определяете в .vstemplate, иначе они будут потеряны в процессе создания и перевода. Они остаются во временной папке, которую он использует для создания всего, а затем удаляются вскоре после этого.

CAD парень
источник
2

В моем случае .Pubxml - один из тех файлов в списке None . Он не предназначен для создания решения или как статический файл для веб-проекта. Но для публикации сайта в Azure конфигурации в нем присутствуют.

Согласно статье Microsoft, это основные типы, которые мы видим среди тегов файлов .csproj :

Нет - файл не входит в группу вывода проекта и не компилируется в процессе сборки. Примером является текстовый файл, содержащий документацию, например файл Readme.

Компилировать - файл компилируется в вывод сборки. Этот параметр используется для файлов кода.

Содержимое - файл не компилируется, но включается в группу вывода содержимого. Например, этот параметр является значением по умолчанию для файла .htm или другого типа веб-файла.

Встроенный ресурс - этот файл встроен в основной вывод сборки проекта как DLL или исполняемый файл. Обычно он используется для файлов ресурсов.

IKriKan
источник
1
Прокомментируйте, пожалуйста, здесь, если что-то вводит в заблуждение или неясно, просто голосование против не помогает мне улучшить его. Заранее спасибо.
IKriKan
1
Я часто получаю ошибку: имя элемента «Нет» для включения «Properties \ PublishProfiles \ FolderProfile.pubxml» должно быть «Content». в моем проекте Asp.Net на Bamboo, и иногда повторный запуск сборки может просто исправить это, поэтому не знаю, в чем именно проблема,
Бочен Линь
Привет, @BochenLin, детали, которые вы упомянули здесь, немного скудны, можете ли вы попытаться предоставить более подробную информацию здесь или опубликовать новый вопрос с полной информацией о проблеме и снимком экрана, если возможно [а затем поделитесь ссылкой на вопрос здесь].
IKriKan
0

Файлы содержимого не включаются в сборку, но включаются в публикацию.

Никакие файлы не включаются в сборку или публикацию, если они не настроены таким образом вами. Например, если для параметра «Копировать в выходной каталог» установлено значение «Всегда» или «Новее», они будут включены как в сборку, так и в публикацию.

carlin.scott
источник