Я пытаюсь написать систему подключаемых модулей с .NET Core, и одно из моих требований состоит в том, чтобы иметь возможность распространять библиотеку подключаемого модуля вместе с его зависимостями для установки пользователю.
Однако я не могу понять, как включить мои зависимости NuGet в качестве артефакта сборки и вывести их в папку сборки без необходимости использовать их dotnet publish
в качестве взлома. Есть ли способ указать это в файле .csproj (файле проекта)?
dotnet publish
хак? Включите команду в ваш файл csproj как сценарий пост-сборки.dotnet publish
помещает весь фреймворк в папку публикации, поскольку я пишу плагин, большинство файлов не нужны, поскольку фреймворк уже был бы загружен программой загрузчика. Я ищу что-то похожее на то, как сборки работают в .NET Framework.<CopyToOutputDirectory>Always</CopyToOutputDirectory>
в ваш csproj каждой из DLL, которые вы хотите переместить, не помогает? Возможно совмещать с<link>
узлом?<PackageReference/>
не поддерживает<CopyToOutputDirectory>
.Ответы:
Вы можете добавить это в
<PropertyGroup>
свой файл csproj, чтобы принудительно копировать сборки NuGet в выходные данные сборки:Однако обратите внимание, что вывод сборки (
bin/Release/netcoreapp*/*
) не должен быть переносимым и распространяемым, выводdotnet publish
- это. Но в вашем случае копирование сборок в выходные данные сборки, вероятно, очень полезно для целей тестирования. Но обратите внимание, что вы также можете использоватьDependencyContext
api для разрешения библиотек DLL и их местоположений, которые являются частью графа зависимостей приложения, вместо перечисления локального каталога.источник
DependencyContext
? Как я могу использовать его для поиска библиотеки DLL, которой нет в каталоге приложения? А где это вообще?Вы можете использовать PostBuildEvent для автоматизации развертывания модуля при сборке.
Чтобы получить сборки NuGet в папке сборки, добавьте csproj вашего модуля
Определите, какие файлы модулей вы хотите использовать, используя Include / Exclude (при необходимости измените путь)
Сбросьте папку сборки по умолчанию и добавьте PostbuildEvent
Я включаю app_offline для повторного использования приложения, если оно уже запущено, чтобы избежать ошибок использования файла.
источник
Добавление
не сработало, но добавив это в файл Framework .csproj:
сделал.
источник
Я «решил» (создал обходной путь) это более простым способом.
В пост-сборке
pub
это папка, в которой вы хотите разместить опубликованные материалыПРИМЕЧАНИЕ: в зависимости от того, какую версию
dotnet.exe
вы используете, команда--no-build
может быть недоступна.Например, недоступно в версии 2.0.3; и доступен в v2.1.402. Я знаю, что VS2017 Update4 имел v2.0.3. И Update8 имеет 2.1.x
Обновить:
Приведенная выше настройка будет работать в базовой среде отладки, но для ее использования в среде сервера сборки / производственной среды требуется больше. В этом конкретном примере, который мне пришлось решать, мы строим
Release|x64
иRelease|x86
отдельно. Так что я учел оба. Но для поддержки команды post builddotnet publish
я сначала добавилRuntimeIdentifier
файл проекта.Зачем мне это было нужно и почему без него можно обойтись? Мне это было нужно, потому что моя программа сборки настроена на перехват предупреждения MSB3270 и сбой сборки, если оно появится. Это предупреждение говорит: «Эй, некоторые файлы в ваших зависимостях имеют неправильный формат». Но вы помните цель этого упражнения? Нам нужно вытащить библиотеки зависимостей пакетов. И во многих случаях не имеет значения, есть ли это предупреждение, потому что следующая сборка поста не имеет значения. Опять же, это моя программа сборки, которая заботится. Итак, я добавил только
RuntimeIdentifier
2 конфигурации, которые использую во время производственной сборки.Полная сборка поста
Объяснение: dotnet publish ищет
obj\Debug
илиobj\Release
. У нас его нет во время сборки, потому что сборка создаетobj\x64\Release
илиobj\x86\Release
. Строки 1 и 2 смягчают эту проблему. В строке 3 я говорюdotnet.exe
использовать определенную конфигурацию и целевую среду выполнения. В противном случае, когда это режим отладки, меня не интересуют вещи и предупреждения во время выполнения. И в последней строке я просто беру свои dll и копирую их в выходную папку. Работа выполнена.источник
dotnet publish "$(ProjectFileName)" -c Release --no-build -o bin\pub
xcopy "$(ProjectDir)pub\PostSharp.dll" "$(OutDir)"
В сочетании с приведенным выше ответом: у меня это отлично работает в командной строке события после сборки: в Visual Studio. Он перебирает выбранные библиотеки DLL (System * .dll и Microsoft .dll) *, а затем пропускает удаление определенных dll. System.Data.SqlClient.dll и System.Runtime.Loader.dll
источник