C # Советует местоположение вывода пакета Nuget

#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, отличная идея! Я тоже подумал об этом. К сожалению, в конце это не то решение, которое я ищу. Редактировать: также мой проект больше не выполняется как проект с одним файлом.