#c# #msbuild
#c# #msbuild
Вопрос:
В старом формате файлы были явно включены в элемент <Compile…> . Большинство файлов в новом формате сюда не включены, явно включены только .cs-файлы на уровне .csproj. Обычно «Program.cs» и т. д.
Для этого нет четких объяснений. Большинство просто упоминают «новое соглашение» и «стандартные пути включения и исключения». Что это за пути? Выполняет ли он рекурсивный поиск дочерних папок в папке .csproj? Если я создам другой .cs-файл с конфликтующим типом с другим, который «включен», может ли он быть ошибочно проанализирован, даже если он явно не включен в мое решение?
Комментарии:
1. Я не могу дать вам канонический ответ, но, по моему опыту, он отражает физическую структуру файлов и папок с некоторым интеллектом (т. Е. Без папок obj и bin). Если вы создаете конфликтующий тип, вы получите некоторые (обычно полу-полезные) ошибки компилятора.
2. Вы проверили, что эта компиляция по умолчанию включена в проекты .NET Core ?
Ответ №1:
Включенные по умолчанию компиляции описаны здесь:
Компиляция по умолчанию включает
По умолчанию включает и исключает для элементов компиляции, встроенных ресурсов и
None
элементов, определенных в SDK. В отличие от проектов .NET Framework, не связанных с SDK, вам не нужно указывать эти элементы в файле проекта, поскольку значения по умолчанию охватывают наиболее распространенные варианты использования. Это делает файл проекта меньше и его легче понять и отредактировать вручную, если это необходимо.В следующей таблице показано, какие элементы и какие глобусы включены и исключены в .NET SDK:
Элемент Включить глобус Исключить глобус> Удалить глобус Скомпилировать ** / * .cs (или другие языковые расширения) **/*.user; ** /*.*proj; ** /*.sln; ** /*.vssscc N/A EmbeddedResource **/ * .resx **/*.user; ** /*.*proj; ** /*.sln; ** /*.vssscc N/A Нет **/* **/*.user; ** /*.*proj; ** /*.sln; ** /*.vssscc **/*.cs; ** /*.resx Обратите
./bin
./obj
внимание, что папки и, которые представлены свойствами$(BaseOutputPath)
и$(BaseIntermediateOutputPath)
MSBuild, по умолчанию исключены из глобусов. Исключения представлены свойством$(DefaultItemExcludes)
.
Так что да, он рекурсивно выполняет поиск .cs
файлов в папке проекта. Если он найдет два файла, которые определяют один и тот же тип, он попытается скомпилировать их оба, и вы получите ошибки компилятора.
Чтобы исключить использование файла
<Compile Remove="Path/To/File.cs"/>
в <ItemGroup>
. Вы также можете щелкнуть файл правой кнопкой мыши в Visual Studio и выбрать «Исключить из проекта».