#c# #.net #msbuild
#c# #.net #msbuild
Вопрос:
У меня есть корневой каталог с несколькими проектами на C # (* .csproj). Мне нужно, чтобы MSBuild фильтровал исходные файлы C # по корневому пространству имен для каждого проекта, поскольку они используют один и тот же корневой каталог. В противном случае я получу error CS0017: Program has more than one entry point defined
, когда попытаюсь запустить проект с помощью dotnet run --project Project1.csproj
. Структура папок моего проекта организована на основе функций, а тестовые файлы включены во вложенные папки функций.
Пример структуры решения:
|_ Project1.csproj
|_ Project2.csproj
|_ Program1.cs (this contains main for Project1 under root namespace P1)
|_ Program2.cs (this contains main for Project2 under root namespace P2)
|_ Feature1 (this feature belongs to Project1 under root namespace P1)
| |_ SomeClass1.cs
| |_ SomeClass1.test.cs
|_ Feature2 (this feature belongs to Project2 under root namespace P2)
|_ SomeClass2.cs
|_ SomeClass2.test.cs
Теперь, как я могу запустить / собрать Project1.csproj таким образом, чтобы MSBuild включал только Program1.cs и SomeClass1.cs. Аналогично с Project2.csproj с Program2.cs и SomeClass2.cs. Могу ли я попросить MSBuild включать только файлы / типы на основе их корневого пространства имен?
Есть идеи, как это сделать?
Комментарии:
1. Вам нужно иметь проекты внутри соответствующих каталогов…
Solution (folder) -> Project1 (folder) -> Project1.csproj, Program1.cs
иSolution (folder) -> Project2 (folder) -> Project2.csproj, Program2.cs
. Невозможно ли реализовать эту структуру?2. Я хочу структурировать проект на основе функций и иметь все исходные файлы из всех проектов (например, сервер, клиент, тест), связанные с функцией, внутри соответствующей подпапки.
3. Вот когда вы делаете вещи излишне сложными и подверженными ошибкам. Вы также можете создавать папки, связанные с функциями, внутри папки проекта и помещать в эти папки классы, специфичные для функций. Структуры проектов .NET ориентированы на проекты и решения, и вы по-прежнему упорядочиваете свой код и файлы в соответствии с функциями / уровнями.
4. Спасибо за ваше мнение, но это не отвечает на мой вопрос. В конце концов, здесь нет правильного или неправильного подхода, и я не собираюсь обсуждать плюсы и минусы. Но если вы знаете способ добиться того, что я прошу о локализации функциональных файлов, я был бы очень признателен.
5. У меня есть один вопрос… структура, которую вы описали выше, — это структура решения, которую вы видите в обозревателе решений VS? Можете ли вы также поделиться структурой физических папок вашего решения?
Ответ №1:
Конечно, то, что вы делаете, сделано неправильно. Скорее всего, вы пытались достичь чего-то, чего можно было достичь по-другому.
Но вот законный метод достижения того, что вы ищете. В вашем Project1.csproj
добавлении ItemGroup
, подобном этому
<ItemGroup>
<None Remove="Project2.csproj" />
<None Remove="Program2.cs" />
</ItemGroup>
Вышесказанное основано на предположении, что у вас новый формат файла проекта, в котором каждый файл в папке автоматически включается в проект. В отличие от старого формата framework, файлы были явно перечислены внутри файла проекта.
Фактически, у Microsoft теперь есть раздел «Сохранить существующие проекты» и «создать проект .NET»
Комментарии:
1. Привет, Т.С. Я получаю эту ошибку, когда пытаюсь
dotnet run --project Project1.csproj
в терминале:Program1.cs(7,21): error CS0017: Program has more than one entry point defined. Compile with /main to specify the type that contains the entry point.
2. Кроме того, нужно ли мне иметь тег удаления для каждого файла из других проектов или только для файлов project и entry class?
3. @geeko это говорит вам о том , что у вас их несколько
void Main(string[] atgs)
. У вас должен быть только 1, и если у вас их большеProgramX.cs
, вам нужно перечислить все, чтобы msbuild их игнорировал4. Мне нужно иметь несколько точек входа, потому что существует несколько проектов (например, сервер, клиент, тест). Вот почему мне нужно отфильтровать, какие исходные файлы попадают в сборку для каждого проекта, например, указав корневое пространство имен для каждого проекта. Знаете ли вы какой-нибудь способ сделать это?
5. Тем не менее, каждый проект имеет абсолютно одну точку входа, которую я пытаюсь запустить, используя
dotnet run --project Project1.csproj