Bagaimana cara mendapatkan fungsionalitas Visual Studio 'Publish' untuk menyertakan file dari acara pasca membangun?


90

Saat ini saya mencoba menggunakan fungsionalitas Visual Studio 2010 'Publikasikan' dan MSDeploy untuk menangani kebutuhan penyebaran web saya tetapi mengalami hambatan sehubungan dengan menyesuaikan paket tergantung pada konfigurasi build saya.

Saya mengembangkan di lingkungan 32bit tetapi perlu membuat paket rilis untuk lingkungan 64bit, jadi dalam konfigurasi 'Rilis' saya memiliki acara pembuatan posting yang menyalin versi 64bit dari dll pihak ketiga ke dalam direktori bin menimpa versi 32bit . Ketika saya menggunakan fungsionalitas 'Publikasikan', meskipun dll 64bit yang benar sedang disalin ke direktori bin, itu tidak disertakan dalam paket.

Apakah ada cara untuk mendapatkan 'Publikasikan' untuk menyertakan file yang telah disalin ke direktori bin selama acara pembuatan posting?


1
Jika Anda menggunakan acara pra- bangun, ini tampaknya berfungsi seperti yang Anda inginkan (template proyek Visual Studio 2013, ASP.NET).
bzlm

Mereka tampaknya telah menghapus perilaku yang dibuat sebelumnya yang disebutkan dalam komentar di atas di Visual Studio 2015 dan yang lebih baru.
justdan23

Jawaban:


92

Saya menjawab pertanyaan serupa tetapi berbeda di Bagaimana Anda menyertakan file tambahan menggunakan paket penyebaran web VS2010? .

Dalam skenario Anda, Anda menggunakan acara pasca pembangunan, saya akan merekomendasikan untuk menghentikan acara pasca membangun dan menerapkan tindakan Anda menggunakan target MSBuild Anda sendiri daripada acara pasca membangun. Di bawah ini Anda akan menemukan teks dari jawaban lainnya.


Dari: Bagaimana Anda menyertakan file tambahan menggunakan paket penyebaran web VS2010?


Pertanyaan bagus. Saya baru saja memposting entri blog yang sangat rinci tentang ini di Alat Penyebaran Web (MSDeploy): Paket Bangun termasuk file tambahan atau tidak termasuk file tertentu .

Berikut sinopsisnya. Setelah memasukkan file, saya juga menunjukkan cara mengecualikan file.

Termasuk File Ekstra

Memasukkan file ekstra ke dalam paket sedikit lebih sulit tetapi tetap tidak penting jika Anda merasa nyaman dengan MSBuild, dan jika tidak, bacalah ini. Untuk melakukan ini kita perlu menghubungkan ke bagian proses yang mengumpulkan file untuk dikemas. Target yang perlu kita perluas disebut CopyAllFilesToSingleFolder. Target ini memiliki properti ketergantungan, PipelinePreDeployCopyAllFilesToOneFolderDependsOn, yang dapat kita manfaatkan dan masukkan target kita sendiri. Jadi kita akan membuat target bernama CustomCollectFiles dan memasukkannya ke dalam proses. Kami mencapai ini dengan yang berikut (ingat setelah pernyataan impor).

<PropertyGroup>
  <CopyAllFilesToSingleFolderForPackageDependsOn>
    CustomCollectFiles;
    $(CopyAllFilesToSingleFolderForPackageDependsOn);
  </CopyAllFilesToSingleFolderForPackageDependsOn>
</PropertyGroup>

Ini akan menambahkan target kita ke proses, sekarang kita perlu menentukan target itu sendiri. Anggaplah Anda memiliki folder bernama Extra Files yang berada 1 tingkat di atas proyek web Anda. Anda ingin memasukkan semua file itu. Ini adalah target CustomCollectFiles dan kita akan membahasnya setelah itu.

<Target Name="CustomCollectFiles">
  <ItemGroup>
    <_CustomFiles Include="..\Extra Files\**\*" />

    <FilesForPackagingFromProject  Include="%(_CustomFiles.Identity)">
      <DestinationRelativePath>Extra Files\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
    </FilesForPackagingFromProject>
  </ItemGroup>
</Target>

Di sini yang saya lakukan adalah membuat item _CustomFiles dan di atribut Include memberi tahu untuk mengambil semua file di folder itu dan folder apa pun di bawahnya. Kemudian saya menggunakan item ini untuk mengisi item FilesForPackagingFromProject. Ini adalah item yang sebenarnya digunakan MSDeploy untuk menambahkan file tambahan. Juga perhatikan bahwa saya menyatakan nilai metadata DestinationRelativePath. Ini akan menentukan jalur relatif yang akan ditempatkan dalam paket. Saya menggunakan pernyataan Extra Files% (RecursiveDir)% (Filename)% (Extension) di sini. Apa yang dikatakannya adalah meletakkannya di lokasi relatif yang sama dalam paket seperti di bawah folder File Ekstra.

Mengecualikan file

Jika Anda membuka file proyek dari aplikasi web yang dibuat dengan VS 2010 di bagian bawahnya, Anda akan menemukan baris dengan.

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />

BTW Anda dapat membuka file proyek di dalam VS. Klik kanan pada proyek pilih Unload Project. Kemudian klik kanan pada proyek yang dibongkar dan pilih Edit Proyek.

Pernyataan ini akan mencakup semua target dan tugas yang kita butuhkan. Sebagian besar penyesuaian kami harus setelah impor itu, jika Anda tidak yakin menempatkan jika setelah! Jadi jika Anda memiliki file untuk dikecualikan, ada nama item, ExcludeFromPackageFiles, yang dapat digunakan untuk melakukannya. Misalnya, Anda memiliki file bernama Sample.Debug.js yang disertakan dalam aplikasi web Anda, tetapi Anda ingin file tersebut dikecualikan dari paket yang dibuat. Anda dapat menempatkan potongan di bawah ini setelah pernyataan impor itu.

<ItemGroup>
  <ExcludeFromPackageFiles Include="Sample.Debug.xml">
    <FromTarget>Project</FromTarget>
  </ExcludeFromPackageFiles>
</ItemGroup>

Dengan mendeklarasikan mengisi item ini, file akan secara otomatis dikecualikan. Perhatikan penggunaan metadata FromTarget di sini. Saya tidak akan membahasnya di sini, tetapi Anda harus tahu untuk selalu menjelaskannya.


8
@Kata, ini tampaknya tidak berfungsi untuk VS2012, apakah Anda tahu bagaimana ini dapat diperbarui untuk skenario ini. mengubah ke v11.0 tidak berfungsi. TIA.
Simon Francesco

2
Secara harfiah tidak ada dokumentasi di mana pun tentang hal ini. Dokumentasi Microsoft mereferensikan blog Anda.
Matthew James Davis

2
@Daniel Jika Anda hanya memerlukan file tertentu dan bukan folder, cukup ubah _CustomFiles untuk menyertakan file spesifik tersebut alih-alih menambahkan secara rekursif dengan ***. Jadi sesuatu seperti <_CustomFiles Include = ".. \ Dependencies \ FileA.dll" /> <_ CustomFiles Include = "C: \ Someotherplace \ FileB.txt" /> Sesuatu yang mirip dengan itu.
bwerks

3
@SimonFrancesco Saya mengalami hal ini juga, dan perubahan yang diperlukan tampaknya telah memperluas <CopyAllFilesToSingleFolderForMsdeployDependsOn> daripada <CopyAllFilesToSingleFolderForPackageDependsOn> seperti yang tertulis dalam jawaban di atas.
bwerks


13

Saya menemukan solusi untuk masalah ini dengan menggunakan ExcludeFilesFromDeploymentelemen dalam file proyek. Saya mendapat ide dari Penyebaran Web: Mengecualikan File dan Folder

Jadi, jika Anda perlu mengemas file proyek seperti yang ada di direktori proyek Anda setelah berhasil membangun dan langkah-langkah pembuatan posting terkait, lakukan hal berikut.

  1. Edit setelan proyek "Paket / Publikasikan Web" dan
    pilih Item yang akan diterapkan menjadi "Semua file dalam folder proyek ini"
  2. Bongkar proyek
  3. Klik kanan pada proyek yang dibongkar dan pilih untuk mengedit konfigurasi proyek
  4. Temukan PropertyGroupelemen yang terkait dengan pengaturan konfigurasi, misalnya "Rilis"
  5. Di dalam PropertyGroupelemen, tambahkan elemen berikut dan kecualikan file dan folder yang tidak Anda inginkan dalam paket

    <ExcludeFilesFromDeployment>*.cs;**\.svn\**\*.*;Web.*.config;*.csproj*</ExcludeFilesFromDeployment>
    <ExcludeFoldersFromDeployment>.svn;Controllers;BootstrapperTasks;Properties</ExcludeFoldersFromDeployment>
    
  6. Simpan dan muat ulang proyek Anda

Ini memecahkan masalah saya untuk saat ini tetapi jika ada solusi yang lebih baik maka tolong beri tahu saya, karena ini tidak ideal karena peretasan yang terlibat, tetapi sekali lagi mungkin ini adalah skenario penerapan yang tidak umum?


6

Pilih file atau folder Anda dan Ubah tindakan Build sebagai Konten dari Jendela Properti.


1
Benar, tetapi sebagai tambahan Anda harus memilih "Salin jika lebih baru" atau "Salin selalu", karena jika tidak, tindakan defaultnya adalah "Jangan salin", meskipun "Konten" dipilih.
Matt

1
setuju dengan matt untuk langkah tambahan
Gomes

7
Tidak ada tindakan Build untuk folder (VS2013)
Cristian E.

copytooutputdirectory = Salin Selalu
Gomes

Bekerja bahkan tanpa Salin Selalu.
Tengiz

3

Saya tahu ini pertanyaan lama tetapi tidak ada yang berhasil untuk saya.

Pada VS 2017 saya hanya mengklik kanan pada folder tambahan yang akan diterbitkan dan memilih mempublikasikan itu berhasil.

Contoh:

masukkan deskripsi gambar di sini


Meskipun ini adalah langkah ekstra kecil, ini sangat sederhana.
Ciaran Gallagher

0

Menambahkan folder bin (dan isinya) ke proyek menyebabkan file disalin ke direktori keluaran terbitkan.

Bagi saya, masalah saya adalah saya perlu menempatkan file lisensi perangkat lunak berpemilik di folder bin /, tetapi tidak ingin menyalinnya secara manual setiap penerapan.

Ini menggunakan Visual Studio 2015 Professional


0

Saya tahu ini adalah percakapan lama tetapi saya menemukannya ketika mencoba melakukan hal yang sama dan saya pikir akan membantu untuk menambahkan apa yang saya temukan di sini.

Hampir semua artikel tentang menyertakan file tambahan dalam publikasi Anda menggunakan metode penambahan CopyAllFilesToSingleFolderForPackageDependsOnatau CopyAllFilesToSingleFolderForMSDeployDependsOnitem di dalam PropertyGroupdan semuanya sama seperti "Saya menambahkan ini ke akhir file ..."

Inilah yang saya lakukan dan menghabiskan sore hari mencoba menemukan mengapa tidak ada yang terjadi sampai saya menyadari sudah ada PropertyGroupbagian di bagian atas file. Ketika saya memasukkan saya CopyAllFilesToSingleFolderForPackageDependsOnke bagian itu, itu bekerja dengan baik.

Semoga ini menghemat waktu seseorang suatu hari nanti

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.