Post build olayındaki dosyaları dahil etmek için Visual Studio 'Publish' işlevselliği nasıl elde edilir?


90

Şu anda web dağıtım ihtiyaçlarımı karşılamak için Visual Studio 2010 'Yayınla' ve MSDeploy işlevlerini kullanmaya çalışıyorum, ancak derleme yapılandırmama bağlı olarak paketi özelleştirme konusunda bir engelle karşılaştım.

32 bit ortamında geliştirme yapıyorum ancak 64 bit ortam için bir yayın paketi oluşturmam gerekiyor, bu nedenle 'Yayın' yapılandırmasında üçüncü taraf bir dll'nin 64 bit sürümünü 32 bit sürümünün üzerine yazan bin dizinine kopyalayan bir post build olayım var . 'Yayınla' işlevini kullandığımda, doğru 64 bit dll, bin dizinine kopyalanmasına rağmen pakete dahil edilmiyor.

Post build olayı sırasında bin dizinine kopyalanan dosyaları dahil etmek için 'Yayınla'yı almanın bir yolu var mı?


1
Bunun yerine bir pre -build olayı kullanırsanız, bu zaten istediğiniz gibi çalışıyor gibi görünür (Visual Studio 2013, ASP.NET proje şablonu).
bzlm

Visual Studio 2015 ve sonraki sürümlerde yukarıdaki yorumda belirtilen önceden oluşturulmuş davranışı kaldırmış gibi görünüyorlar.
justdan23

Yanıtlar:


92

VS2010 web dağıtım paketlerini kullanarak ek dosyaları nasıl eklersiniz? Bölümünde benzer ancak farklı bir soruyu yanıtladım. .

Senaryonuzda post build olayını kullanıyorsunuz, post build olayını bırakmanızı ve eylemlerinizi post build olayı yerine kendi MSBuild hedeflerinizi kullanarak uygulamanızı öneririm. Aşağıda diğer cevabın metnini bulacaksınız.


Kimden: VS2010 web dağıtım paketlerini kullanarak ek dosyaları nasıl eklersiniz?


Harika soru. Web Dağıtımı Aracı'nda (MSDeploy) bununla ilgili çok ayrıntılı bir blog yazısı yayınladım : Ekstra dosyalar içeren veya belirli dosyaları hariç tutan Paket Oluştur .

İşte özet. Dosyaları ekledikten sonra, dosyaları nasıl dışlayacağımı da gösteriyorum.

Ekstra Dosyalar Dahil

Pakete fazladan dosya eklemek biraz daha zordur, ancak MSBuild konusunda rahatsanız ve eğer değilseniz bunu okuyun. Bunu yapmak için, işlemin paketleme için dosyaları toplayan kısmına bağlanmamız gerekir. Uzatmamız gereken hedefin adı CopyAllFilesToSingleFolder. Bu hedef, kendi hedefimize dokunup enjekte edebileceğimiz PipelinePreDeployCopyAllFilesToOneFolderDependsOn adlı bir bağımlılık özelliğine sahiptir. Bu yüzden CustomCollectFiles adında bir hedef oluşturacağız ve bunu sürece enjekte edeceğiz. Bunu şu şekilde başarıyoruz (import ifadesinden sonra hatırlayın).

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

Bu, hedefimizi sürece katacak, şimdi hedefin kendisini tanımlamamız gerekiyor. Web projenizin 1 seviye üzerinde bulunan Ekstra Dosyalar adında bir klasörünüz olduğunu varsayalım. Tüm bu dosyaları dahil etmek istiyorsunuz. İşte CustomCollectFiles hedefi ve bundan sonra tartışıyoruz.

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

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

Burada yaptığım şey _CustomFiles öğesini oluşturmaktı ve Include özniteliğinde ona o klasördeki tüm dosyaları ve altındaki herhangi bir klasörü almasını söyledim. Sonra FilesForPackagingFromProject öğesini doldurmak için bu öğeyi kullanıyorum. Bu, MSDeploy'un fazladan dosya eklemek için kullandığı öğedir. Ayrıca meta veri DestinationRelativePath değerini ilan ettiğime dikkat edin. Bu, pakete yerleştirileceği göreceli yolu belirleyecektir. Burada Extra Files% (RecursiveDir)% (Filename)% (Extension) ifadesini kullandım. Bu, onu Ekstra Dosyalar klasörünün altında olduğu gibi pakette aynı göreceli konuma yerleştirmektir.

Dosyaları hariç tutma

VS 2010 ile oluşturulmuş bir web uygulamasının proje dosyasını aşağıya doğru açarsanız, ile bir satır bulacaksınız.

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

BTW proje dosyasını VS'nin içinde açabilirsiniz. Projeye sağ tıklayın Projeyi Kaldır'ı seçin. Ardından yüklenmemiş projeye sağ tıklayın ve Projeyi Düzenle'yi seçin.

Bu ifade, ihtiyacımız olan tüm hedefleri ve görevleri içerecektir. Özelleştirmelerimizin çoğu, daha sonra konulacağından emin değilseniz, bu içe aktarmadan sonra olmalıdır! Dolayısıyla, dışarıda bırakılacak dosyalarınız varsa, bunu yapmak için kullanılabilecek ExcludeFromPackageFiles bir öğe adı vardır. Örneğin, web uygulamanızda bulunan Sample.Debug.js adlı dosyanız olduğunu varsayalım, ancak bu dosyanın oluşturulan paketlerin dışında kalmasını istiyorsunuz. Snippet'i, bu import ifadesinden sonra aşağıya yerleştirebilirsiniz.

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

Bu öğe doldurulduğunda, dosyalar otomatik olarak dışlanacaktır. FromTarget meta verilerinin kullanımına buradan dikkat edin. Burada buna girmeyeceğim, ancak bunu her zaman belirtmeniz gerektiğini bilmelisiniz.


8
@ Söyledi, bu VS2012 için işe yaramıyor gibi görünüyor, bunun bu senaryo için nasıl güncellenebileceğini biliyor musunuz? v11.0'a geçiş çalışmaz. TIA.
Simon Francesco

2
Bu şeyler hakkında kelimenin tam anlamıyla hiçbir belge yok. Microsoft belgeleri bloglarınıza atıfta bulunur.
Matthew James Davis

2
@Daniel Bir klasöre değil de belirli dosyalara ihtiyacınız varsa, _CustomFiles'ı *** ile özyinelemeli olarak eklemek yerine bu belirli dosyaları içerecek şekilde değiştirin. Yani <_CustomFiles Include = ".. \ Dependencies \ FileA.dll" /> <_ CustomFiles Include = "C: \ Someotherplace \ FileB.txt" /> Buna benzer bir şey.
bwerks

3
@SimonFrancesco Bunu da deneyimledim ve gerekli değişiklik yukarıdaki cevapta yazıldığı gibi <CopyAllFilesToSingleFolderForPackageDependsOn> yerine <CopyAllFilesToSingleFolderForMsdeployDependsOn> 'u genişletmek gibi görünüyor.
bwerks


13

ExcludeFilesFromDeploymentProje dosyasındaki öğeyi kullanarak sorun için bir geçici çözüm buldum . Fikri Web Dağıtımından aldım : Dosyaları ve Klasörleri Hariç Tutma

Dolayısıyla, başarılı bir derlemeden ve ilgili derleme sonrası adımlarından sonra proje dosyalarını proje dizininizde olduğu gibi paketlemeniz gerekiyorsa aşağıdakileri yapın.

  1. "Web'i Paketle / Yayınla" proje ayarlarını
    düzenleyin ve dağıtılacak Öğeleri "Bu proje klasöründeki tüm dosyalar" olarak seçin
  2. Projeyi kaldır
  3. Yüklenmemiş projeye sağ tıklayın ve proje yapılandırmasını düzenlemeyi seçin
  4. PropertyGroupYapılandırma ayarıyla ilişkili öğeyi bulun, örneğin "Serbest Bırak"
  5. İçinde PropertyGroupaşağıdaki unsurları içinde eleman ekleme ve dosya ve klasörleri hariç Pakete istemiyoruz

    <ExcludeFilesFromDeployment>*.cs;**\.svn\**\*.*;Web.*.config;*.csproj*</ExcludeFilesFromDeployment>
    <ExcludeFoldersFromDeployment>.svn;Controllers;BootstrapperTasks;Properties</ExcludeFoldersFromDeployment>
    
  6. Projenizi kaydedin ve yeniden yükleyin

Bu, şimdilik sorunumu çözdü, ancak daha iyi bir çözüm varsa, lütfen bana bildirin, çünkü bu, ilgili bilgisayar korsanlığı nedeniyle ideal değildir, ancak yine de bu, yaygın olmayan bir dağıtım senaryosudur?


6

Dosyalarınızı veya klasörlerinizi seçin ve Özellikler Penceresinden İçerik olarak Oluştur eylemini Değiştirin.


1
Doğru, ancak ek olarak "Daha yeniyse kopyala" veya "Her zaman kopyala" seçeneğini seçmelisiniz, çünkü aksi takdirde "İçerik" seçilmiş olsa bile varsayılan eylem "Kopyalama" olacaktır.
Matt

1
ek adım için matt ile aynı fikirde
Gomes

7
Hiçbir Yapı eylem klasörler için (VS2013) var
Cristian E'ye

copytooutputdirectory = Her Zaman Kopyala
Gomes

Her Zaman Kopyala olmadan bile çalıştı.
Tengiz

3

Bunun eski bir soru olduğunu biliyorum ama bunların hiçbiri benim için işe yaramadı.

2017 VS'de yayınlanacak ekstra klasöre sağ tıkladım ve çalıştığını yayınlamayı seçtim.

Misal:

görüntü açıklamasını buraya girin


Küçük bir ekstra adım olmasına rağmen çok basittir.
Ciaran Gallagher

0

Bin klasörünün (ve içeriğinin) projeye eklenmesi, dosyaların yayın çıktı dizinine kopyalanmasına neden oldu.

Benim için sorunum, tescilli bir yazılım lisans dosyasını bin / klasörüne yerleştirmem gerekti, ancak her dağıtımda manuel olarak kopyalamak istemememdi.

Bu, Visual Studio 2015 Professional kullanıyordu


0

Bunun eski bir konuşma olduğunu biliyorum ama aynı şeyi yapmaya çalışırken karşılaştım ve burada bulduklarımı eklemenin yararlı olacağını düşündüm.

Yayınınıza fazladan dosyalar eklemekle ilgili makalelerin neredeyse tamamı, CopyAllFilesToSingleFolderForPackageDependsOnveya CopyAllFilesToSingleFolderForMSDeployDependsOnöğelerini içine eklemek için bu yöntemi kullanır PropertyGroupve hepsi aynı şeyi "Bunu dosyanın sonuna ekledim ..."

Bunu yaptım ve bir öğleden sonrayı neden hiçbir şey olmadığını bulmaya çalışarak PropertyGroupdosyanın en üstünde zaten bir bölüm olduğunu fark edene kadar geçirdim . Kendimi CopyAllFilesToSingleFolderForPackageDependsOno bölüme koyduğumda iyi çalıştı.

Umarım bu bir gün birine zaman kazandırır

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.