İçerik dosyalarını asp.net proje dosyasına otomatik olarak eklemenin bir yolu var mı?


88

ASP.NET projeme sık sık çok sayıda içerik dosyası (çoğunlukla görüntüler ve js) ekliyorum. VS yayınlama sistemini kullanıyorum ve yayınlandığında, yeni dosyalar ben onları projeye dahil edene kadar yayınlanmıyor. Tüm dosyaları belirtilen dizine otomatik olarak dahil etmek istiyorum. Hangi dizinlerin csproj dosyasına veya başka bir yere otomatik olarak dahil edilmesi gerektiğini belirlemenin bir yolu var mı?



1
tam olarak aradığım şey değil
Marko

Çözüm tarayıcınızın içindeki klasörü değiştirirken sorununuzla ilgili cevabımı güncelledim.
Filburt

Yanıtlar:


135

Eski ileti dizisi, biliyorum, ama bunu yapmanın bir yolunu buldum ve sürekli unutuyorum ve son bir kez bulmak için arayışımda, bu soruya rastladım. Bulduğum en iyi yol, .csproj dosyasında BeforeBuild hedefini kullanmaktır.

<Target Name="BeforeBuild">
    <ItemGroup>
        <Content Include="**\*.less" />
    </ItemGroup>
</Target>

VS 2010 bu bölüme dokunmaz ve proje her oluşturulduğunda dosyalarınızın içerik olarak dahil edilmesini sağlar.


.Less kelimesinin anlamı nedir? Ve tüm dizi ne anlama geliyor **\*.less?
Kayıtlı Kullanıcı

3
.less dosyaları, Less CSS ön işlemcisi tarafından ayrıştırılması amaçlanan css dosyalarıdır. Bununla ilgili daha fazla bilgi için Google "daha az nokta". İfade **\*.less, tüm dizinlerdeki tüm * .less dosyalarını içerir. MSBUILD dilinde, ** 'tüm dizinler yinelemeli' anlamına gelir
Chris

4
En azından VS 2012'de, projeden bir dosya ekleyip çıkardığınızda ve kaydettiğiniz anda, bu maalesef tam listeye genişletilir. :(
Chris Phillips

3
Bu, yalnızca BeforeBuild'i AfterBuild olarak değiştirdikten sonra benim durumum için çalıştı, derlemem, dosyaları hareket ettiren bir powershell betiğini başlattı, bu da daha sonra Azure web dağıtım girişimim tarafından alınmayacaktı çünkü bunlar yalnızca derleme başarılı olduktan sonra var oldu. "BeforeBuild" i görmek bana muhtemelen bir "AterBuild" de olduğunu gösterdi. Umarım bu başka birine yardımcı olur.
Luke Rice

1
@John , VS2015 + ile ilgili bir düzeltme için aşağıdaki cevabıma bakın .
Jesse

55

Web sitenizin .csproj dosyasını genişletebilirsiniz. İçerik kök klasörünüzü yinelemeli bir joker karakterle eklemeniz yeterlidir:

...
<ItemGroup>
    <!-- your normal project content -->
    <Content Include="Default.aspx" />

    <!-- your static content you like to publish -->
    <Content Include="Images\**\*.*" />
</ItemGroup>
...

Bunu yapmak, bu klasörü ve aşağıdaki tüm içeriği çözüm tarayıcınızda görünür hale getirir.

Çözüm tarayıcısının içindeki klasörü belirterek gizlemeye çalışırsanız

<Content Include="Images\**.*.*">
    <Visible>false</Visible>
</Content>

yayınlanmayacak.


Güncelleme

Zaten keşfettiğiniz gibi, joker karakter, çözümünüzün içindeki klasöre dokunduğunuz anda değiştirilecektir çünkü VS projeleri rastgele içerik içerecek şekilde tasarlanmamıştır.

Bu nedenle, klasörün ve içeriğinin VS içinden asla değiştirilmediğinden emin olmalısınız - dosya eklemek veya kaldırmak yalnızca dosya sisteminde yapılabilir ... Sorunuzu anladığım için istediğiniz şey buydu.

Klasör VS'de gizli olsaydı daha kolay olurdu, ancak onu gizlemenin VE yayınlamanın bir yolunu bulamadım.

Başka bir başarısız yaklaşım, klasörü bir CreateItemGörev ile dahil etmekti . Bu, klasör içeriğinin \ bin \ app.publish \ ... olarak yayınlanmasıyla sonuçlandı ve .csproj içindeki içerik öğeleriyle birlikte yayınlamaya ikna edilemedi, bu yüzden cevabımda sunmadım .


3
Dosyayı manuel olarak ekleyip kaldırana kadar çalışıyor. Bu satırdan sonra <Content Include = "Images * *. " /> Proje dosyasından kaybolur.
Marko

2
@Marko doğru. Ekledikten <Content Include="Images\**\*.*" />sonra çalıştı. Daha fazla resim eklediğinizde .csproj değiştirilir ve resimlerdeki tüm dosyaları / ... listelemeye geri döner ve <Content Include = "Images * *. " /> Kaybolur.
Ravi Ram

Bu kodu ayrı bir .proj dosyasına yapıştırın ve .csproj dosyasındaki önceki derleme hedefinden çağırın.
NL - Monica'dan özür dile,

21

Chris'in cevabını kullanırken sorun yaşayanlar için bu , Visual Studio 2012 ve daha yeni sürümler için çözümdür:

<Target Name="ContentsBeforeBuild" AfterTargets="BeforeBuild">
  <ItemGroup>
    <Content Include="images\**" />
  </ItemGroup>
</Target>

Chris cevapta belirtildiği üzere - Visual Studio olmaz bu dokunma <Target>el hedef dizin olan (dosyalar ekleme / kaldırma) aylaklık bile bölümü.

Lütfen dosyaların bulunduğu bir alt dizin eklemeniz gerektiğini unutmayın (yukarıdaki durumda bu alt dizindir images). Visual Studio / MSBuild, bu dosyaları proje yapısı içinde aynı dizine yerleştirir. Bir alt dizin kullanmazsanız, dosyalar proje yapısının kök dizinine yerleştirilecektir.

Joker karakterlerin hızlı bir açıklaması için:

  • **aracı her şey yinelemeli (o dahilinde dosyalar, alt dizinler ve dosyalar)
  • *.extextüst düzey dizindeki uzantıya sahip tüm dosyaları içerir , ancak alt dizinleri içermez
    • Örneğin, *.extolabilir *.png, *.jsvb Herhangi bir dosya uzantısı çalışacak
  • **\*.extextüst düzey dizinden ve tüm alt dizinlerden uzantıya sahip tüm dosyaları içerecektir .
  • Nant / Ant adlandırma kalıplarını nasıl kullanırım? Bölümündeki cevaba bakın. örneklerle daha eksiksiz bir açıklama için.

Tamamlamak için, kullanmakla kullanmamak arasında bir fark olduğunu lütfen unutmayın <Target>.

İle <Target>yaklaşımda, Visual Studio olmaz Solution Explorer içindeki dosyaları gösteriyor.

<Target Name="ContentsBeforeBuild" AfterTargets="BeforeBuild">
  <ItemGroup>
    <Content Include="images\**" />
  </ItemGroup>
</Target>

Olmayan <Target>yaklaşım olacaktır Visual Studio talimat göstermek Solution Explorer içindeki dosyaları. Bunun dezavantajı, otomatik dizinlerin herhangi bir şekilde değiştirilmesinin Visual Studio'nun joker karakter girişini geçersiz kılmasına neden olmasıdır. Aşağıdaki yaklaşımın , Çözüm Gezgini'ni yalnızca VS'de Solution / Project açtıktan sonra güncelleyeceği de unutulmamalıdır . Çözüm Gezgini'nin "yenile" araç çubuğu düğmesi bile bunu yapmaz.

<ItemGroup>
  <Content Include="images\**" />
</ItemGroup>

1
Denediğiniz ve <Hedef> kullanmak ile kullanmama arasındaki farklara işaret ettiğiniz için teşekkürler. Joker karakterlerin ayrıntılarının da harika açıklaması.
Kurt Hutchinson

@KurtHutchinson - sorun değil. =)
Jesse

Bu çözümün cilalanması gerektiğine inanıyorum. Hedefe "BeforeBuild" den sonra koşma talimatı verdiğinizde, teorik olarak bu, yayınlandıktan SONRA da olabilir. Mevcut çözüm muhtemelen şans nedeniyle işe yarıyor.
Imre Pühvel

@ ImrePühvel Yayınlamak anlamaya nasıl olur önceBeforeBuild olay? MSBuild, yayınlamayı düşünmeden önce projeyi ve ikili dosyaları oluşturmalıdır.
Jesse

1
Derlemeden önce yayınlama olduğunu iddia etmedim, ancak beyan, öğelerin yayınlanmadan önce içeriğe ekleneceğini garanti etmiyor. Kod örneği: .. AfterTargets="BeforeBuild". Yani, özel hedefinizin BeforeBuild'den sonra çalıştırılması gerekir, ancak ne kadar sonra olduğunu belirtmez. Yine de hatam, mevcut hedef sıralama algoritmasına göre sorun yok: msdn.microsoft.com/en-us/library/ee216359.aspx
Imre Pühvel

10

System.IO.Directory.GetFile(string)Tüm dosyaları özyinelemeli olarak dahil etmek için çerçevenin yöntemini ve aşırı yüklemelerini kullanabilirsiniz.

  <ItemGroup>
    <Content Include="$([System.IO.Directory]::GetFiles('$(ProjectDir)Scripts\', '*.js', SearchOption.AllDirectories))" />
    <Content Include="$([System.IO.Directory]::GetFiles('$(ProjectDir)Images\', '*.png', SearchOption.AllDirectories))" />
  </ItemGroup>

Bu bana çok yardımcı oldu; Birkaç seviye derinliğinde birden fazla dizine sahibim ve otomatik olarak eklenmesini istediğim çok sayıda dosya var ve bu, tüm bu içerikleri bir haline getirdi. Teşekkürler!
Jay Otterbein

2
Bunu biraz daha denedim ve bunun Include="**\*.ext"joker karakterlerle aynı sınırlamalara sahip olduğu ortaya çıktı .
Steven Liekens

Vay canına, proje dosyası çalıştırma powershell'i içeriyor mu? Bu hiç korumalı mı? Bu gerçekleşmeyi bekleyen bir istismar.
Brain2000

PowerShell değil. MSBuild, statik yöntemleri çağırmak için kendi sözdizimine sahiptir. Dokümanlara göre, bu bir sistem sınıfıyla sınırlıdır. docs.microsoft.com/en-us/visualstudio/msbuild/… Her ne kadar herhangi bir argüman ile sadece <Exec> powershell yapabileceğinizden eminim ...
Steven Liekens

3

Küçük bir powershell komut dosyasıyla oluşturulan içeriği nasıl alabildiğimi yazdım:

$folders = Get-ChildItem .\ -r -Directory
$filtered = $folders |Select-Object @{Name='FullName';Expression={$_.fullname.replace($pwd,'')}}, @{Name='FolderDepth';Expression={($_.fullname.Split('\').Count) - ($Pwd.Path.split('\').count)}} | Sort-Object -Descending FullName,folderDepth 
$basefolders = $filtered | Where-Object{$_.folderdepth -eq 1}
$basefoldersobj = @()
foreach($basefolder in $basefolders)
{
  $basefoldername =$baseFolder.fullname
  $filteredbase = $filtered -match "\$basefoldername\\" | Sort-Object -Descending FolderDepth | Select-Object -first 1
  if($filteredbase -eq $null)
  {
    $filteredbase = $filtered -match "\$basefoldername" | Sort-Object -Descending FolderDepth | Select-Object -first 1
  }
  $obj = New-Object psobject
  Add-Member -InputObject $obj -MemberType NoteProperty -Name 'Folder' -Value $basefolder.fullname.trim('\')
  Add-member -InputObject $obj -MemberType NoteProperty -Name 'DeepestPath' -Value $filteredbase.folderDepth
  $basefoldersobj += $obj
}
$include = '*.*'
foreach($bfolderObj in $basefoldersobj)
{
  $includecount = ''
  $includecount = "\$include" * ($bfolderObj.Deepestpath)
  Write-Output "<content Include=`"$($bfolderObj.folder)$includecount`" /> "
}

Bu, powershell komut isteminde gerekli dahil etme ifadesini üretmelidir


2

Bunun gibi bağlantılar içeren dosyalar ekleyebilirsiniz, bunlar aranabilir, görüntülenebilir, ancak bunları değiştirmeye çalışırsanız kullanıma alınmazlar, ayrıca visual studio joker karakterleri yerinde bırakır:

  <ItemGroup>
    <Content Include="..\Database Schema\Views\*.sql">
      <Link>Views\*.sql</Link>
    </Content>
  </ItemGroup>

Bu, .proj dosyasının içine gider.


1
Bunu denedim ve VS kullanarak bir dosya eklediğimde veya kaldırdığımda VS joker karakterini tek tek dosyalarla değiştiriyor.
carlin.scott

Bu çok zarif, ancak joker karakteri bağlantı hedefinden kaldırmalısınız
SimSimY

1

Bildiğim kadarıyla değil; ancak benim önerim bunları varsayılan olarak içereceği için projeye yapıştırmaktır. Bu nedenle, bunları Explorer aracılığıyla dizine yapıştırmak yerine, dosyaları klasörlere yapıştırmak için Visual Studio'yu kullanın.


-1

Bunun için en iyi çözümün dosyaları tek tek elle eklemek olduğunu fark ettim. Benim yaptığım gibi yüzlercesine sahipseniz, bu sadece birkaç saat meselesiydi. 2016'da VS 2015 ile bile bu ciddi sorunun hala çözülmemiş olması komik. Ahh, Xcode'u ne kadar seviyorum.

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.