#c# #visual-studio #nuget
#c# #visual-studio #nuget
Вопрос:
Я работаю над образовательным проектом, и мне трудно организовать проект. В течение последних трех дней я пытался найти решение, но пока ничего не нашел. Я пытаюсь сделать вывод сборки максимально чистым и организованным.
Проблема, с которой я загрузил два пакета nuget с обоими их зависимостями. Поэтому, когда я создаю свой проект, все DLL-файлы создаются в главном / корневом каталоге профиля конфигурации (Debug или release).)
**Issue Terminal/bin/Debug/net5.0:**
/Core.dll (Project reference)
/MySql.Data.dll
/Terminal.Gui.dll
/Dependency1.dll
/Dependency2.dll
/Dependency3.dll
/Dependency...dll```
**Goal Terminal/bin/Debug/net5.0:**
/bin/server/Core.dll (project reference)
/bin/packages/MySql.Data.dll
/bin/packages/Terminal.Gui.dll
/bin/packages/Dependency1.dll
/bin/packages/Dependency2.dll
/bin/packages/Dependency4.dll
/bin/packages/Dependency....dll
Комментарии:
1. Все ссылки, необходимые для выполнения программы, должны находиться в одном каталоге. Вы можете поместить их в разные места во время компиляции, если хотите по какой-либо причине, но программа не будет работать.
2. @MartinCostello есть ли в любом случае способ уменьшить количество DLL-файлов? Потому что прямо сейчас у меня есть 18 DLL-файлов всего для 3 ссылок
3. Они помещены туда, потому что они необходимы где-то в вашем дереве зависимостей для работы вашего приложения. Есть ли какая-либо причина, по которой вы хотите иметь меньше файлов в каталоге приложения, кроме «это более аккуратно»?
4. @MartinCostello Здравствуйте, причина в размере проекта.
5. Возможно, вам следует изучить сборку-обрезку: docs.microsoft.com/en-us/dotnet/core/deploying /…
Ответ №1:
Запишите их в csproj
файл:
<Target Name="CopyToDesintation" AfterTargets="Build">
<Copy SourceFiles="@(RuntimeCopyLocalItems)" DestinationFolder="$(TargetDir)binpackages"></Copy>
<Copy SourceFiles="$(TargetDir)Core.dll" DestinationFolder="$(TargetDir)binserver"></Copy>
</Target>
Затем перестройте свой проект, чтобы проверить его.
Обновить
Пожалуйста, перезапишите цель _CopyFilesMarkedCopyLocal
системы по умолчанию
1) создайте файл с именем Directory.Build.targets
file в папке проекта:
2) добавьте их в этот файл:
<Project>
<Target Name="_CopyFilesMarkedCopyLocal">
<Copy SourceFiles="@(RuntimeCopyLocalItems)" DestinationFolder="$(TargetDir)binpackages"></Copy>
<Copy SourceFiles="@(ReferenceCopyLocalPaths)" DestinationFolder="$(TargetDir)binserver"></Copy>
</Target>
</Project>
Хотя server
папка содержит библиотеки dll пакета, это не имеет значения для ваших потребностей, и библиотеки DLL не находятся в корневой папке. И это лучшая функция, которую я когда-либо находил.
Комментарии:
1. Привет, @Perry, спасибо за ваш ответ. Я попробовал ваш код, но это не решило мою проблему. Ссылка на проект (Core.ddl) была скопирована в пользовательскую папку, но оригинал все еще находился в корневой папке. Я не смог запустить приложение, если удалил оригинал. И ссылка на Nuget вообще не копировалась.
2. Это
core.dll
ваша ссылка на проект dll или dll из ссылочного проекта?3. Привет, Перри, ядро. dll — это второй проект в рамках того же решения. Используется в качестве ссылки.
4. Я нашел лучшее решение, пожалуйста, проверьте мой обновленный ответ.
5. Это сделало свое дело! Спасибо вам большое, очень, очень большое!
Ответ №2:
Вы можете упаковать его как отдельный исполняемый файл в .NET 5.
В .csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
<PublishSingleFile>true</PublishSingleFile>
<SelfContained>true</SelfContained>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<PublishTrimmed>true</PublishTrimmed>
<PublishReadyToRun>true</PublishReadyToRun>
</PropertyGroup>
</Project>
или через CLI:
dotnet publish -r win-x64 -p:PublishSingleFile=true --self-contained true
Видишь https://docs.microsoft.com/en-us/dotnet/core/deploying/single-file
Комментарии:
1. Привет, @Nullforce, отличная идея! Я тоже подумал об этом. К сожалению, в конце это не то решение, которое я ищу. Редактировать: также мой проект больше не выполняется как проект с одним файлом.