2012-12-13 21 views
25

Visual Studio 2010'u, dağıtımla aynı web sitesinde bulunan yaklaşık 40 farklı web uygulamasını korumak için kullanıyorum. Bu projeler aynı çözümdedir ancak her biri farklı şeyler yaptıklarından farklı projelerde barındırılmaktadır.Visual Studio "Add As Link" hata ayıklaması sırasında çalışmaz

Css/js dosyalarını çeşitli projeler arasında "Bağlantı Ekle" seçeneği ile css veya js dosyalarını bir kez güncelleyebilmem ve otomatik olarak çeşitli projelere yansıtılan güncellemeleri otomatik olarak güncellemeye çalışıyorum. her bir projeyi inşa et ve yeniden konuşlandır.

Karşılaştığım sorun, yerel olarak bir bilgisayarımı hata ayıklama amacıyla bilgisayarım üzerinde çalıştırmaya çalıştığım zamandır. Bir dosya bulunamadı.

Benim Düşünce: Ben yerel uygulamaları çalıştırırken bu klasör yapısı nedeniyle farklı olduğunu varsayalım. Dosyaları, yalnızca hata ayıklama modunda oluştururken ve göreli URL'leri buna göre ayarladığımda, web sunucumuza yayınlamadan önce uygulamayı düzgün bir şekilde test edebilmem için projeye kopyalamanın bir yolu olup olmadığını merak ediyorum.

sayesinde bu soruna

+0

içerecektir sizin .proj dosyanın sonuna aşağıdaki yapıştırarak çözülebilir? Sanırım tam anlamıyla bir yol buysa, yerel olarak bununla başa çıkamayacağınız bu olurdu. – IyaTaisho

+0

@lyaTaisho Doğru bir .NET stili bağlantı olarak kurulmuyor. "../../../SharedProjectFolder/css/style.css" benzeri bir temel göreli URL kullanır – Chattah

+0

Aynı dosya yapısı ve tüm yerel kutunuzda? – IyaTaisho

cevap

33

çözüm Her yapı sırasında bağlantı olarak eklenir (js, css veya diğerleri gibi) içerik dosyalarını kopyalıyor. Bunu yapmanın birkaç yolu var. Farklı web uygulama projeleri tarafından yeniden kullanılabilen MSBuild hedefini kullanmam konusunda tavsiyede bulunabilirim.

Yani şu içerikle (o WebApplication.Extension.targets adlandırarak örneğin) aşağıdaki dosyası oluşturabilirsiniz:

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 

    <!-- Override the default target dependencies to --> 
    <!-- include the new CopyLinkedContentFiles target. --> 
    <PropertyGroup> 
     <BuildDependsOn> 
      CopyLinkedContentFiles; 
      $(BuildDependsOn); 
     </BuildDependsOn> 
    </PropertyGroup> 

    <!-- 
    ============================================================ 
    CopyLinkedContentFiles 

    A new target to copy any linked content files into the 
    web application output folder. 

    NOTE: This is necessary even when '$(OutDir)' has not been redirected. 
    ============================================================ 
    --> 
    <Target Name="CopyLinkedContentFiles"> 
     <!-- Remove any old copies of the files --> 
     <Delete Condition=" '%(Content.Link)' != '' AND Exists('$(WebProjectOutputDir)\%(Content.Link)') " 
       Files="$(WebProjectOutputDir)\%(Content.Link)" /> 
     <!-- Copy linked content files recursively to the project folder --> 
     <Copy Condition=" '%(Content.Link)' != '' " SourceFiles="%(Content.Identity)" 
       DestinationFiles="$(WebProjectOutputDir)\%(Content.Link)" /> 
    </Target> 
</Project> 

Ve sonra aşağıdaki satırı yerleştirerek size web uygulaması projesi bu hedefi eklemek .Csproj dosyada:

<Import Project="$(MSBuildProjectDirectory)[RelativePathToFile]\WebApplication.Extension.targets" /> 

Temelde aşağıdaki birinden sonra .csproj dosyasında bu satırı ekleyebilirsiniz:

<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> 

Bu sorundan sonra bağlantı olarak eklenen içerik dosyalarının çözülmesi gerekir.

Düzenleme: ayıklama yapılandırması Durumu elemanını belirtmek için yeteneği var MsBuild inşa edilmiştir yalnızca aşağıdaki mantığı çalıştırmak için. Bir süre önce

Bu sorunu aşmak için bir 'MSBuild.WebApplication.CopyContentLinkedFiles yarattı:

<Import Project="$(MSBuildProjectDirectory)[RelativePathToFile]\WebApplication.Extension.targets" Condition=" '$(Configuration)' == 'Debug' "/> 

EDIT2: Örneğin

sadece aşağıdaki ithalat deyimini güncelleyebilir ayıklama yapılandırma için belirtilen hedef ithal etmek 'nuget paketi. Bu paket, derleme sırasında proje klasörüne bağlantı olarak eklenen tüm içerik dosyalarını kopyalayan MsBuild hedefini ekler.

+0

Bunu yapmak, yalnızca hata ayıklama işlemi sırasında dosyaları kopyalayıp web sunucusu ve göreceli olarak yayınlanacak bir sürüm oluşturma sırasında değil; URL'ler çalışmalı? Her projenin kendi JS ve CSS dosyalarının kendi kopyasına sahip olmasını istemiyorum. Cevap için teşekkürler. – Chattah

+1

@Chattah, Yalnızca hata ayıklama yapılandırması için yürütülecek çözümün nasıl sağlanacağını yanıtlamak için cevabımı güncelleştirdim. Lütfen düzenleme bölümüne bakın. –

+0

Bunun bir uyarısı var. Örneğin, dosyaları bağlarsanız, bu hedefi ekleyin ve bir proje oluşturun; içerik dosyaları (örneğin, aspx) kopyalanır. Daha sonra, bağlantılı dosyaları silerseniz, kopyalanan dosyalar asla çözümün bir parçası olmadıkları için kalır. Bir web sitesiyle, bu, aspx dosyalarında kalan ve artık arkasındaki kod artık bulunmayan ve dolayısıyla derlenmeyen sonuçlara yol açar. Aspnet_compiler.exe'yi (ön derleme için) çalıştırdığınızda, aspx dosyasını alır, ayrıştırır ve varolmayan kod arkasıyla ilişkili türü yükleyemediğinden şikayet eder. Bir yapı sunucusunda bu düzeltmek daha zordur. –

27

otomatik MSBuild kullanarak Her yapı kendi "sanal" yerlere tüm bağlı içerik dosyalarını kopyalamak için bir çözüm buradadır:

Bu ne zaman bağlantılı dosyaları tarayıcıya sunulacak olmasını sağlar http://mattperdeck.com/post/Copying-linked-content-files-at-each-build-using-MSBuild.aspx

F5'e bas.

+0

Bu daha fazla dikkat gerektiren harika bir çözüm! –

+0

Katılıyorum! Çok basit düzeltme ve sürekli yapılar için TFS kullanıyorsanız, TFS Oluşturmayı etkilemiyor. – ps2goat

+0

Çok basit ve fevkalade çalıştı. Paylaşım için teşekkürler! –

0

Bağlantılı dosyaların sanal konuma kopyalanmasıyla ilgili büyük bir sorun var: Bağlantılı dosyalardan birine işaret eden bir JavaScript referansında Tanıma Git (Shift + F2) kullanırsanız, yerel olarak alınacaktır. kopyalanan dosya, dosyaya DEĞİL. Ardından, yerel sürümü düzenleme hatası yapmak zorundasınız, böylece bağlantılı dosyaları kullanmanın yararlarını ortadan kaldırırsınız. Ayrıca, bu Intellisense ile sorunlara neden olabilir.

Daha iyi bir çözüm: Bağlantılı dosyaları ilgili bağlantıların yanında ilişkili proje dizinine kopyalamak yerine, bu dizinin içindeki bir "hiddenDebug" klasörüne kopyalayın (veya istediğiniz dizini saklayın; yönetmek daha kolay ve daha sonra aşağıda açıklayacağım gibi hata ayıklama sırasında yolları işlemek için).

İşte "hiddenDebug" klasörüne paylaşılan deposundan dosyaları kopyalamak için nasıl (kaynak projenin Sonrası Yapı etkinliğe eklenecek):

Tek CSS Dosyası

xcopy/Y "$ (ProjectDir) App_Themes \ THEME1 \ Shared.css" "$ (SolutionDir) WebApp \ App_Themes \ THEME1 \ hiddenDebug \"

JavaScript dizinine

xcopy/Y/S "$ (ProjectDir) Scripts" "$ (SolutionDir) WebApp \ Scripts \ Paylaşılan \ hiddenDebug \"

Hata ayıklama yaparken, paylaşılan dosyaları 'Kaynak yollarını Yanıt kullanarak dinamik olarak değiştirebilirsiniz. Global.asax'ta filtreleyin. İşte bir örnek: (Paylaşılan projede)

Tepki Filtre Sınıfı

Imports System.IO 

Namespace Code 
    Public Class LinkedReferencesFilter 
    Inherits MemoryStream 

     Private ReadOnly outputStream As Stream = Nothing 
     Private ReadOnly _IsDevEnvironment As Boolean = False 

     Public Sub New(ByVal output As Stream, IsDevEnvironment As Boolean) 
      Me.outputStream = output 
      Me._IsDevEnvironment = IsDevEnvironment 
     End Sub 

     Public Overrides Sub Write(ByVal buffer As Byte(), ByVal offset As Integer, ByVal count As Integer) 
      ' Convert the content in buffer to a string 
      Dim contentInBuffer As String = UTF8Encoding.UTF8.GetString(buffer) 

      If Me._IsDevEnvironment Then 
       contentInBuffer = contentInBuffer.Replace("<script src=""Scripts/Shared/", "<script src=""Scripts/Shared/hiddenDebug/") 
       contentInBuffer = contentInBuffer.Replace("/Scripts/Shared/", "/Scripts/Shared/hiddenDebug/") 
       contentInBuffer = contentInBuffer.Replace("/App_Themes/Theme1/Shared.css", "/App_Themes/Theme1/hiddenDebug/Shared.css") 
      End If 

      Me.outputStream.Write(UTF8Encoding.UTF8.GetBytes(contentInBuffer), offset, UTF8Encoding.UTF8.GetByteCount(contentInBuffer)) 
     End Sub 
    End Class 
End Namespace 

Global.asax

Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs) 
    ' Simulate internet latency on local browsing 
    If Request.IsLocal Then 
     System.Threading.Thread.Sleep(50) 
    End If 

    Dim currentRelativePath As String = Request.AppRelativeCurrentExecutionFilePath 

    If request__1.HttpMethod = "GET" Then 
     If currentRelativePath.EndsWith(".aspx") Then 
      Dim IsDevEnvironment As Boolean = False 
      //Use whatever method you want to determine whether your current environment is a development environment: 
      #If CONFIG = "Develop" Then 
       IsDevEnvironment = True 
      #End If 

      Response.Filter = 
       New Shared.Code.LinkedReferencesFilter(
        output:=Response.Filter, 
        IsDevEnvironment:=IsDevEnvironment) 
     End If 
    End If 
End Sub 

Giderme: boşaltma ve bağlantılı öğeleri ile projeyi tekrar yüklemeyi deneyin. Bu yardımcı olmazsa, projenize hiddenDebug dizinini ekleyin. Bunu yapmak zorundaydım, ancak daha sonra onu kaldırabiliyordum. Bu çok titiz ... Microsoft bu özelliği cilalamış olsa iyi olurdu, ama şimdilik belirledim.

Bilmiyorsanız: web uygulamanızı yayınladığınızda, kaynak (bağlanan) dosyalar otomatik olarak yayınlama hedefine kopyalanır. Bu ayarlandıktan sonra, bunu unutabilirsiniz. En iyi yanı, Intellisense veya hızlı navigasyon kaybetmeyeceksiniz.

TypeScript'e geçiş yaptıktan sonra, çoğu JavaScript dosya referansı zorlukları basitleştirilecek veya ortadan kaldırılacaktır (diğer yönetilen .NET dillerinde kullanılabilenler gibi kolay proje karşılaştırması yapmayı umuyorum, ancak bu tür etkinlikleri etkinleştirmek için bazı geçici çözümler olabilir. işlevi).

Lütfen bunun sizin için uygun olup olmadığını veya daha iyi bir yolunuz olup olmadığını bildirin.

1

Ayrıca gibi bağlantı göz ne, bağlantılı dosyaları

Sadece meraktan
<Target Name="CopyLinkedContentFiles" BeforeTargets="Build"> 
<Copy SourceFiles="%(Content.Identity)" 
     DestinationFiles="%(Content.Link)" 
     SkipUnchangedFiles='true' 
     OverwriteReadOnlyFiles='true' 
     Condition="'%(Content.Link)' != ''" /> 

İlgili konular