В файле .csproj, что такое <None Include = "..." > для?

Как

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

отличается от

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

?

Ответ 1

В статье MSDN, посвященной build action, объясняются различия.

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

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

Ответ 2

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

Ответ 3

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

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

MSDN: "группа вывода проекта" или "Группа вывода контента" используются только термины, используемые в веб-проекте, правильно?

Ответ 4

В моей ситуации файл 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. Поэтому вы не должны изменять этот параметр на Embedded Ресурс, поскольку это будет включать изображение два раза в сборка.

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

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

Ответ 5

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

Однажды мое решение (содержащее упомянутый проект) прекратило компиляцию: "Целевая" Build "не существует в проекте".

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

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

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

<None Include="SpecRunner.html" />

к

<Content Include="SpecRunner.html" />

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

Ответ 6

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