2010-06-02 12 views
15

Visual Studio 2010'daki tümleşik Web Dağıtımı oldukça hoş. Hedef IIS makinesinde MSDeploy kullanılarak dağıtılmaya hazır bir paket oluşturabilir. Sorun şu ki, bu paket MSDeploy kurulduğunda IIS'den "Import Application" kullanılarak kendisini kuracak bir istemciye yeniden dağıtılacaktır.VS2010 Web Dağıtımı: mutlak yollar nasıl kaldırılır ve setAcl otomatikleştirilir?

daima oluşturulan varsayılan paket geliştirme makineden tam yolu, include "D: \ Dev \ XXX \ obj \ Debug \ Package \ PackageTmp" kaynak manifest dosyasında. Bu şekilde tasarlandığından, kursun kurulumunu engellemez, ancak içe aktarma diyaloğunda çirkin görünüyor ve müşteri için bir anlamı yok. Daha kötüsü, bu yolların ne olduğunu merak edecek ve oldukça kafa karıştırıcı görünüyor. (Paket oluşturma görevi kullandığı MSBuild özelliklerini ekleyerek) .Csproj dosyasını özelleştirerek

, ben pakete ek parametreleri eklemek başardı. Ancak, öğleden çoğunu 2600 satırlık Web.Publishing.targets öğesinde, boş bırakılan "geliştirme yolu" davranışını etkileyen parametreyi anlamaya çalıştım. Ayrıca, dağıtımdan sonra belirli bir klasörde güvenliği özelleştirmek için setAcl kullanmayı denedim, ancak bunu yalnızca göreli bir yol kullanarak MSBuild ile yapmayı başardım ... ilk sorunu çözüp çözmemem önemli değil.

Oluşturulan arşivi oluşturulduktan sonra değiştirebilirim ancak MSBuild kullanarak her şeyin otomatikleştirilmesini tercih ederim. Bunu yapmayı bilen var mı?

cevap

27

Görüntülenen yol, _MSDeployDirPath_FullPath özelliği tarafından belirlenir.

  • <_MSDeployDirPath_FullPath>@(_MSDeployDirPath->'%(FullPath)')</_MSDeployDirPath_FullPath>
  • <_MSDeployDirPath Include="$(_PackageTempDir)" />
  • <_PackageTempDir>$(PackageTempRootDir)\PackageTmp</_PackageTempDir>
  • <PackageTempRootDir>$(IntermediateOutputPath)Package</PackageTempRootDir>

_MSDeployDirPath_FullPath <-- @(_MSDeployDirPath->'%(FullPath)') <-- _PackageTempDir <-- $(PackageTempRootDir)\PackageTmp

:

Bu tesis özelliklerinin bu zincir tarafından ayarlı olduğu 10

Gördüğünüz gibi, göreceli bir yola sahip olamazsınız, çünkü _MSDeployDirPath_FullPath, _MSDeployDirPath tam yoludur.

Ama siz , görüntülenen yolu, müşterinize görüntülenmesini istediğiniz yolla_PackageTempDir geçersiz kılarak görüntüyü basitleştirebilirsiniz. Komut satırında

  • :

    msbuild.exe projectfile.csproj /t:Package /p:_PackageTempDir=C:\Package 
    
  • Veya doğrudan proje dosyasında Sen özelliğini geçersiz olabilir

    (Bu yol paket nesil için geçici dizini olarak kullanılacaktır) :

    <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> 
    <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" /> 
    
    <!-- Must be after Microsoft.WebApplication.targets import --> 
    <PropertyGroup> 
        <_PackageTempDir>C:\Package</_PackageTempDir> 
    </PropertyGroup> 
    
+0

Teşekkürler, iki hafta sonra bir cevap alacağımı düşünmedim ... ve başka bir Lyonnais. Dünya kesinlikle küçüktür. –

+0

Arkadaşım Lyonnais ^^ –

2

Bu eski bir soru ve kabul edilen cevap aslında benim için iş yaptığını biliyorum, ama daha iyi bir yolu var: http://sedodream.com/2013/01/13/WebPackagingFixingTheLongPathIssue.aspx

Bağlantı koptuğunda kodu buraya kopyalarım. Tüm kredi Sayed'e - yazarına gitmeli.senin Package.pubxml dosyasında

Eğer <Property Group> etiketinin içine ekleyin:

<PackagePath Condition=" '$(PackagePath)'=='' ">website</PackagePath> 
    <EnableAddReplaceToUpdatePacakgePath Condition=" '$(EnableAddReplaceToUpdatePacakgePath)'=='' ">true</EnableAddReplaceToUpdatePacakgePath> 
    <PackageDependsOn> 
     $(PackageDependsOn); 
     AddReplaceRuleForAppPath; 
    </PackageDependsOn> 

Ve <Property Group> sonra

ancak <Project> içinde bu ekleyin:

İşte
<Target Name="AddReplaceRuleForAppPath" Condition=" '$(EnableAddReplaceToUpdatePacakgePath)'=='true' "> 
    <PropertyGroup> 
     <_PkgPathFull>$([System.IO.Path]::GetFullPath($(WPPAllFilesInSingleFolder)))</_PkgPathFull> 
    </PropertyGroup> 

    <!-- escape the text into a regex --> 
    <EscapeTextForRegularExpressions Text="$(_PkgPathFull)"> 
     <Output TaskParameter="Result" PropertyName="_PkgPathRegex" /> 
    </EscapeTextForRegularExpressions> 

    <!-- add the replace rule to update the path --> 
    <ItemGroup> 
     <MsDeployReplaceRules Include="replaceFullPath"> 
     <Match>$(_PkgPathRegex)</Match> 
     <Replace>$(PackagePath)</Replace> 
     </MsDeployReplaceRules> 
    </ItemGroup> 
    </Target> 

numuneler için tam Package.pubxml ile özü buydu.

+1

konusunda yardımcı olmaktan mutluluk duyuyordum Bu çözümü denedim ve paket yollarının kısaltılması için çalıştı, ancak web.config dönüşümlerine müdahale etti. Dönüşümleri düzeltmek için değişiklikleri geri almak zorunda kaldım. – Josh

+0

Bu ilginç, çünkü hiçbir zaman 'web.config' dönüşümleri ve bu düzeltme sorunu yaşamadım. – trailmax

+1

Sorunumun, web.config bağlantı dizelerinin otomatik parametrelendirilmesiyle ilgili olduğu anlaşılıyor. Bununla ilgili bir şey eksik. Ben Josh

İlgili konular