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


125

Visual Studio 2010'daki yeni web paketleme işlevini kullanarak test ediyorum ve gerekli .dll'leri uygulamamın API çağrıları için kullandığı bin klasörüme kopyalamak için bir önceden oluşturma olayını kullandığım bir durumla karşılaştım. Interop ile kullanılabilen COM dll'leri olmadıkları için referans olarak dahil edilemezler.

Dağıtım paketimi oluşturduğumda, yalnızca uygulamayı çalıştırmak için gereken dosyaları dahil etme seçeneğini belirlediğimde bu dosyalar hariç tutulur. Dağıtım ayarlarını bu dosyaları içerecek şekilde yapılandırmanın bir yolu var mı? Bununla ilgili iyi bir belge bulma şansım olmadı.

Yanıtlar:


176

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 dahil edeceğiz. Bunu şu şekilde başarıyoruz (import ifadesinden sonra hatırlayın).

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

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

Bu, hedefimizi sürece katacak, şimdi hedefin kendisini tanımlamamız gerekiyor. Web projenizin 1 seviye üzerinde bulunan Ekstra Dosyalar adlı 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 bu klasördeki tüm dosyaları ve altındaki herhangi bir klasörü almasını söyledim. Bir ihtimal yapmanız gerekiyorsa dışlamak bu listeden bir şey, bir ekleme Excludeiçin öznitelik _CustomFiles.

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 beyan ettiğime dikkat edin. Bu, pakete yerleştirileceği göreceli yolu belirleyecektir. Burada Ekstra Dosyalar% (RecursiveDir)% (Dosya Adı)% (Uzantı) 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 kaldırılan 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 yapılmalıdır! Bu nedenle, dışarıda bırakılacak dosyalarınız varsa, bunu yapmak için kullanılabilecek ExcludeFromPackageFiles adlı bir öğe adı vardır. Örneğin, web uygulamanızda bulunan Sample.Debug.xml adlı dosyanız olduğunu ancak bu dosyanın oluşturulan paketlerin dışında kalmasını istediğinizi varsayalım. 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. FromTargetBuradaki meta verilerin kullanımına dikkat edin . Burada buna girmeyeceğim, ancak bunu her zaman belirtmeniz gerektiğini bilmelisiniz.


3
Yayına ek proje çıktısı eklemek için örneğinizi genişletebilir misiniz?
Anthony Serdyukov

7
VS2012 (RC) yükledim ve benim için farklı bir DependencyProperty vardı. Karışık ekipleri (ve derleme sunucumuzu) desteklemek için, orijinal CopyAllFilesToSingleFolderForPackageDependsOn yapılandırmasına ve DependencyProperty CopyAllFilesToSingleFolderForMsdeployDependsOn
Emil Lerch

2
Bu harika. Bir txt dosyasında depolanan bazı sürüm bilgilerini dağıtmak için bunu kullanma.
lamarant

5
Bu benim için işe yaramıyor gibi görünüyor. VStudio 2013 kullanıyorum. :( Yukarıdaki msbuild kurulumu 2013 için çalışıyor mu?
irperez

8
@SayedIbrahimHashimi ve co. asp.net web sitesinde bu kılavuzun çok daha güncel bir sürümünü oluşturdu . Bu bağlantıyı şiddetle tavsiye ederim, çünkü aramızdaki fark pubxml dosyası yerine csproj dosyasını değiştirirken takılıp kalıyordu.
Adam Venezia

21

Daha basit bir çözüm, csproj dosyasını gerekli dll'yi bin klasörüne eklemek için düzenlemek ve ardından öğeyi 3. taraf dll'lerimizi depoladığımız ortak kitaplık klasöründen bin klasörüne kopyalamak için bir ön oluşturma hedefi oluşturmaktır. Öğe çözüm dosyasında bulunduğundan, msbuild / msdeploy tarafından dağıtılır ve karmaşık hiçbir şey gerekmez.

VS aracılığıyla eklemeden dosyayı dahil etmek için kullanılan etiket (genellikle VCS'nize eklemek isteyecektir)

<Content Include="Bin\3rdPartyNative.dll" ><Visible>false</Visible></Content>

Bu benim için işe yarayan BeforeBuild hedefi:

<Target Name="BeforeBuild">
    <Message Text="Copy $(SolutionDir)Library\3rdPartyNative.dll to '$(TargetDir)'3rdPartyNative.dll" Importance="high" />
    <Copy SourceFiles="$(SolutionDir)Library\3rdPartyNative.dll" DestinationFiles="$(TargetDir)3rdPartyNative.dll" />
</Target>

@ Tuespetre'nin girişi gizleme önerisini içerecek şekilde düzenlendi, böylece görünür bir bin klasörünün önceki dezavantajı kaldırıldı. Tarafımdan doğrulanmadı.


3
"basitlik en üst düzey karmaşıklıktır"
BornToCode

1
Bu, çoğu durumda işe yarar, ancak bin klasörünün dışında eklenmesi gereken dosyalarınız varsa çalışmaz.
Nathan

5
@toxaq, bir şeyleri kaçırıyor olabilirim, ancak karşılaştığım sorun , dosyalara aslında bin klasöründe olmayan dağıtım paketindeki bir konumda ihtiyacım olmasıydı . Yani evet, dosyaları herhangi bir yerden bin klasörüne kopyalayabilirsiniz, ancak bu senaryoda dağıtım paketinde doğru konuma dahil edilmeyeceklerdir. Ne onun değer için, ben ClearScript.V8 projesi ile oldu koştu durum - yerli .DLLs gerekir değil bin dizininde görünür, ancak üst görünmesi gereken - bkz clearscript.codeplex.com/discussions/438696 tartışma .
Nathan

3
Yapabilseydim on kez daha fazla oy verirdim. Kabul edilen cevap bu olmalıdır. Ayrıca <Visible>false</Visible>bunu Solution Explorer'dan gizlemek için ayarlayabileceğinizi de eklemek isterim .
tuespetre

1
@Tohid teşekkürler, bu düzenlemeyi yaptık. Test edilecek herhangi bir MS içeriğim yok, bu yüzden doğrulamadım.
toxaq

7

Tıpkı @toxaq gibi, ancak daha da basit bir çözüm:

Çözüm gezgininde dosyayı kitaplık / referanslar klasörüne bir bağlantı olarak ekleyin ve ardından özelliklerde, yapının çıktısına kopyalanacak şekilde ayarlayın.


3
-1 bu, projenin açık bir bağlayıcı-zaman ilişkisine sahip olmak istediğini varsayar. Geçmeli tip sistemler için uygun değil
MickyD

6

Yani Sayed'in uygulaması benim için işe yaramadı. VS2013 kullanıyorum ve Web Dağıtımı paketini kullanıyorum ve başka bir klasörden bazı eklenti DLL'leri dağıtım paketinin bölmesine eklemem gerekiyor. İşte çalışmasını nasıl başardığım (çok daha kolay):

Csproj dosyanızın altına şunu ekleyin:

<Target Name="AdditionalFilesForPackage" AfterTargets="CopyAllFilesToSingleFolderForMsdeploy">
    <ItemGroup> 
        <Files Include="..\SomeOtherProject\bin\$(Configuration)\*.*"/>
    </ItemGroup>
    <Copy SourceFiles="@(Files)" DestinationFolder="$(_PackageTempDir)\bin\" />  
</Target>

Csproj dosyasında bahsedilen diğer öğeler:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <DeployOnBuild>true</DeployOnBuild>
    <DeployTarget>Package</DeployTarget>
    <DeployIisAppPath>Default Web Site/MyWebsite</DeployIisAppPath>
    <DesktopBuildPackageLocation>..\output\Service\Service\Service.Release.zip</DesktopBuildPackageLocation>
    <FilesToIncludeForPublish>OnlyFilesToRunTheApp</FilesToIncludeForPublish>
    <ExcludeGeneratedDebugSymbol>true</ExcludeGeneratedDebugSymbol>
    <PublishDatabases>false</PublishDatabases>
</PropertyGroup>

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

Teşekkür ederim. VS2015 kullanıyorum ve ayrıca başka bir proje kutusu klasöründen DLLS eklemem gerekiyordu. Çözümünüz en kolay olanıydı ve kusursuz çalıştı.
Rafael

5

Emil Lerch'in yukarıdaki yorumunu vurgulamak için yorum yapmak istedi. Bir Azure SDK yüklediyseniz, farklı bir DependencyProperty arayın.

Temel olarak, "CopyAllFilesToSingleFolderForPackageDependsOn" yerine "CopyAllFilesToSingleFolderForMsdeployDependsOn" kullanmanız gerekebilir. Gerçekten gelişmiş bir MsBuild adamı değilim ve hedeflerimin neden çağrılmadığını belirlemeye çalışırken saçlarımı çekerek saatler harcadım.

Bu sizin için işe yaramazsa ve bir Azure SDK yüklediyseniz işte başka bir bağlantı: http://forums.iis.net/t/1190714.aspx


3

Sayed'in cevabına bir ek olarak, projemdeki ExcludeFromPackageFiles öğelerinin statik bildiriminin yeterli olmadığını buldum. Yalnızca derlemeden sonra kullanılabilen belirli DLL'leri (IIS'ye dağıttığımda gerekli olmayan Azure'a özgü Ninject modülleri) hariç tutmam gerekiyordu.

Bu yüzden, yukarıda yayınlanan CopyAllFilesToSingleFolderForPackageDependsOn numarasını kullanarak ExcludeFromPackageFiles listemi oluşturmaya çalıştım. Ancak, paketleme işlemi ExcludeFromPackageFiles öğelerini zaten kaldırdığı için bu çok geç. Ben de aynı tekniği kullandım ama biraz önce:

<PropertyGroup>
    <ExcludeFilesFromPackageDependsOn>
        $(ExcludeFilesFromPackageDependsOn);
        _ExcludeAzureDlls
    </ExcludeFilesFromPackageDependsOn>
</PropertyGroup>

<Target Name="_ExcludeAzureDlls">
    <ItemGroup>
        <FilesForPackagingFromProjectWithNoAzure Include="@(FilesForPackagingFromProject)"
                               Exclude="%(RootDir)%(Directory)*Azure*.dll" />
        <AzureFiles Include="@(FilesForPackagingFromProject)"
                    Exclude="@(FilesForPackagingFromProjectWithNoAzure)" />
        <ExcludeFromPackageFiles Include="@(AzureFiles)">
            <FromTarget>_ExcludeAzureEnvironmentDlls</FromTarget>
        </ExcludeFromPackageFiles>
    </ItemGroup>
</Target>

Umarım bu birine yardımcı olur ...


1

Ayrıca, dosyayı İçerik | Her zaman kopyala

Ayrıca, dosyayı İçerik |  Her zaman kopyala


1
Görünüşe göre bu, en kolay ve en açık cevap olduğu için en iyi cevap olmalı
J Miglietta
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.