Я "вирішив" (створив обхід) цим простішим способом.
На посаді
dotnet publish "$(ProjectFileName)" --no-build -o pub
xcopy "$(ProjectDir)pub\3rdPartyProvider.*.dll" "$(OutDir)"
pub
- це папка, в яку ви хочете, щоб ваші опубліковані матеріали йшли для постановки
ПРИМІТКА. Залежно від версії, dotnet.exe
яку ви використовуєте, команда --no-build
може бути недоступною.
Наприклад, недоступний у v2.0.3; і доступний у версії 2.12.42. Я знаю, що 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 , і не вийде збірка, якщо вона з'явиться. Це попередження говорить: "Ей, деякі файли у ваших залежностях мають неправильний формат". Але ви пам’ятаєте мету цієї вправи? Нам потрібно витягнути DLL-файли залежності від пакета. І в багатьох випадках не має значення, чи існує таке попередження, оскільки наступне створення повідомлення не має значення. Знову ж таки, це моя програма побудови. Отже, я додав лише 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
Пояснення: дотнет публікація шукає obj\Debug
або obj\Release
. У нас його немає під час збирання, оскільки build створює obj\x64\Release
або obj\x86\Release
. Рядок 1 і 2 пом'якшують це питання. У рядку 3 я кажу dotnet.exe
про використання конкретної конфігурації та цільового часу виконання. В іншому випадку, коли це режим налагодження, я не переймаюся елементами виконання та попередженнями. І в останньому рядку я просто беру свої копи і копіюю потім у вихідну папку. Робота виконана.
dotnet publish
hack? Включіть команду у свій файл csproj як сценарій створення збірки.