Saya "memecahkan" (membuat solusi) ini dengan cara yang lebih sederhana.
Dalam posting membangun
dotnet publish "$(ProjectFileName)" --no-build -o pub
xcopy "$(ProjectDir)pub\3rdPartyProvider.*.dll" "$(OutDir)"
pub
adalah folder tempat Anda ingin item yang telah dipublikasikan digunakan untuk pementasan
CATATAN: tergantung pada versi apa yang dotnet.exe
Anda gunakan, perintah --no-build
mungkin tidak tersedia.
Misalnya, tidak tersedia di v2.0.3; dan tersedia di v2.1.402. Saya tahu bahwa VS2017 Update4 memiliki v2.0.3. Dan Update8 memiliki 2.1.x
Memperbarui:
Penyiapan di atas akan bekerja di lingkungan debug dasar tetapi untuk memasukkannya ke lingkungan server / produksi build lebih banyak yang dibutuhkan. Dalam contoh khusus yang harus saya pecahkan ini, kami membangun Release|x64
dan Release|x86
secara terpisah. Jadi saya memperhitungkan keduanya. Tapi untuk mendukung perintah post build dotnet publish
, saya tambahkan dulu RuntimeIdentifier
ke file project.
<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>
Mengapa saya membutuhkannya dan mengapa Anda bisa pergi tanpanya? Saya memerlukan ini karena program build saya disetel untuk mencegat peringatan MSB3270 , dan gagal membangun jika muncul. Peringatan ini mengatakan, "hei, beberapa file dalam dependensi Anda memiliki format yang salah". Tetapi apakah Anda ingat tujuan dari latihan ini? Kita perlu menarik DLL ketergantungan paket. Dan dalam banyak kasus tidak masalah jika peringatan ini ada karena mengikuti posting membangun tidak peduli. Sekali lagi, ini adalah program build saya yang peduli. Jadi, saya hanya menambahkan RuntimeIdentifier
ke 2 konfigurasi yang saya gunakan selama pembuatan produksi.
Full Post build
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
Penjelasan: dotnet publish sedang mencari obj\Debug
atau obj\Release
. Kami tidak memilikinya selama pembuatan karena build membuat obj\x64\Release
atau obj\x86\Release
. Baris 1 dan 2 mengurangi masalah ini. Sejalan 3 saya memberitahu dotnet.exe
untuk menggunakan konfigurasi tertentu dan target runtime. Jika tidak, saat ini adalah mode debug, saya tidak peduli tentang hal-hal runtime dan peringatan. Dan di baris terakhir saya cukup mengambil dll saya dan menyalinnya ke folder output. Pekerjaan selesai.
dotnet publish
menjadi hack? Sertakan perintah dalam file csproj Anda sebagai skrip post build.