Я «решил» (создал обходной путь) это более простым способом.
В пост-сборке
dotnet publish "$(ProjectFileName)" --no-build -o pub
xcopy "$(ProjectDir)pub\3rdPartyProvider.*.dll" "$(OutDir)"
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 build dotnet publish
я сначала добавил RuntimeIdentifier
файл проекта.
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<OutputPath>..\..\lib\</OutputPath>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x86'">
<OutputPath>..\..\lib\</OutputPath>
<RuntimeIdentifier>win-x86</RuntimeIdentifier>
</PropertyGroup>
Зачем мне это было нужно и почему без него можно обойтись? Мне это было нужно, потому что моя программа сборки настроена на перехват предупреждения MSB3270 и сбой сборки, если оно появится. Это предупреждение говорит: «Эй, некоторые файлы в ваших зависимостях имеют неправильный формат». Но вы помните цель этого упражнения? Нам нужно вытащить библиотеки зависимостей пакетов. И во многих случаях не имеет значения, есть ли это предупреждение, потому что следующая сборка поста не имеет значения. Опять же, это моя программа сборки, которая заботится. Итак, я добавил только RuntimeIdentifier
2 конфигурации, которые использую во время производственной сборки.
Полная сборка поста
if not exist "$(ProjectDir)obj\$(ConfigurationName)" mkdir "$(ProjectDir)obj\$(ConfigurationName)"
xcopy "$(ProjectDir)obj\$(PlatformName)\$(ConfigurationName)" "$(ProjectDir)obj\$(ConfigurationName)" /E /R /Y
if $(ConfigurationName) == Release (
dotnet publish "$(ProjectFileName)" --runtime win-$(PlatformName) --no-build -c $(ConfigurationName) -o pub --no-restore --no-dependencies
) else (
dotnet publish "$(ProjectFileName)" --no-build -c $(ConfigurationName) -o pub --no-restore --no-dependencies
)
xcopy "$(ProjectDir)pub\my3rdPartyCompany.*.dll" "$(OutDir)" /Y /R
Объяснение: dotnet publish ищет obj\Debug
или obj\Release
. У нас его нет во время сборки, потому что сборка создает obj\x64\Release
или obj\x86\Release
. Строки 1 и 2 смягчают эту проблему. В строке 3 я говорю dotnet.exe
использовать определенную конфигурацию и целевую среду выполнения. В противном случае, когда это режим отладки, меня не интересуют вещи и предупреждения во время выполнения. И в последней строке я просто беру свои dll и копирую их в выходную папку. Работа выполнена.
dotnet publish
хак? Включите команду в ваш файл csproj как сценарий пост-сборки.