Saya mencoba untuk menulis sistem plugin dengan .NET Core, dan salah satu persyaratan saya adalah untuk dapat mendistribusikan plugin DLL bersama dengan dependensinya kepada pengguna untuk diinstal.
Namun, saya tidak tahu cara menyertakan dependensi NuGet saya sebagai artefak build dan mengeluarkannya ke folder build, tanpa harus digunakan dotnet publish
sebagai hack. Apakah ada cara agar saya dapat menentukan ini di file .csproj (file proyek)?
dotnet publish
menjadi hack? Sertakan perintah dalam file csproj Anda sebagai skrip post build.dotnet publish
melempar seluruh kerangka kerja di folder terbitkan, karena saya sedang menulis plugin, sebagian besar file tidak diperlukan karena kerangka kerja sudah dimuat oleh program bootstrapper. Saya mencari sesuatu yang mirip dengan cara kerja build di .NET Framework.<CopyToOutputDirectory>Always</CopyToOutputDirectory>
dalam csproj Anda pada setiap dll yang ingin Anda pindahkan tidak berhasil? Mungkin digabungkan dengan<link>
node?<PackageReference/>
tidak mendukung<CopyToOutputDirectory>
.Jawaban:
Anda dapat menambahkan ini ke
<PropertyGroup>
dalam file csproj Anda untuk memaksa penyalinan rakitan NuGet ke output build:Namun, perhatikan bahwa keluaran build (
bin/Release/netcoreapp*/*
) tidak seharusnya portabel dan dapat didistribusikan, keluarannyadotnet publish
adalah. Namun dalam kasus Anda, menyalin rakitan ke keluaran build mungkin sangat berguna untuk tujuan pengujian. Namun perhatikan bahwa Anda juga dapat menggunakanDependencyContext
api untuk menyelesaikan DLL dan lokasinya yang merupakan bagian dari grafik ketergantungan aplikasi alih-alih menghitung direktori lokal.sumber
DependencyContext
? Bagaimana saya dapat menggunakannya untuk menemukan DLL yang tidak ada di direktori aplikasi? Dimana sih itu?Anda dapat menggunakan PostBuildEvent untuk mengotomatiskan penerapan modul pada build.
Untuk mendapatkan assemblies NuGet di folder build tambahkan csproj modul Anda
Tentukan file modul apa yang Anda inginkan di mana menggunakan Include / Exclude (ubah jalur seperlunya)
Setel ulang folder build Anda ke default dan tambahkan PostbuildEvent
Saya menyertakan app_offline untuk mendaur ulang aplikasi jika sudah berjalan untuk menghindari kesalahan penggunaan file.
sumber
Menambahkan
tidak berfungsi, tetapi menambahkan ini ke file Framework .csproj:
melakukan.
sumber
Saya "memecahkan" (membuat solusi) ini dengan cara yang lebih sederhana.
Dalam posting membangun
pub
adalah folder tempat Anda ingin item yang telah dipublikasikan digunakan untuk pementasanCATATAN: 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
danRelease|x86
secara terpisah. Jadi saya memperhitungkan keduanya. Tapi untuk mendukung perintah post builddotnet publish
, saya tambahkan duluRuntimeIdentifier
ke file project.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
Penjelasan: dotnet publish sedang mencari
obj\Debug
atauobj\Release
. Kami tidak memilikinya selama pembuatan karena build membuatobj\x64\Release
atauobj\x86\Release
. Baris 1 dan 2 mengurangi masalah ini. Sejalan 3 saya memberitahudotnet.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.sumber
dotnet publish "$(ProjectFileName)" -c Release --no-build -o bin\pub
xcopy "$(ProjectDir)pub\PostSharp.dll" "$(OutDir)"
Sehubungan dengan jawaban di atas: Saya mendapatkan ini berfungsi dengan baik di baris perintah acara Post-build: di Visual Studio. Ini mengulang pilihan dll (System * .dll dan Microsoft .dll) *, dan kemudian melewatkan penghapusan dll tertentu. System.Data.SqlClient.dll dan System.Runtime.Loader.dll
sumber