Proje konisinin dışındaki .csproj içindeki içerik dosyalarını dahil etme


86

Bir C # projem var, MyProject.csproj "C: \ Projects \ MyProject \" konumunda bulunuyor. Ayrıca bu projenin çıktı dizinine kopyalanmasını istediğim dosyalarım var. Ancak dosyalar "C: \ MyContentFiles \" konumundadır, yani proje konisi içinde DEĞİLDİR. Bu dizinin alt dizinleri de vardır. Dizinin içeriği yönetilmez. Bu nedenle, altında olan her şeyi dahil etmeliyim.

Bunları projeye 'İçerik' olarak dahil ettiğimde kopyalanıyor ancak dizin yapısı kayboluyor. Bunun gibi bir şey yaptım: -

<Content Include="..\..\MyContentFiles\**">
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>

Bu dosyaları / dizinleri, dizin yapısı korunarak projenin çıktı dizinine yinelemeli olarak nasıl kopyalarım?

Yanıtlar:


56

Dosyayı bağlantı olarak eklemeniz gerekiyor:

  1. VS'de projeye sağ tıklayın.
  2. Ekle -> Mevcut Öğe ...
  3. Dosyayı bulun.
  4. Onu seçin ve.
  5. Bağlantı olarak Ekle (iletişim kutusundaki Ekle Düğmesine açılır).
  6. Dosyanın özelliklerini açın ve "Çıktı Dizinine Kopyala" yı "Her zaman kopyala" olarak ayarlayın.

ANCAK Bunu dizin ağacı için yapamazsınız.
Bunun yerine bunun için inşa sonrası görev yazmanız gerekir. Bu, dikkatinizi çekecek bir örnek .


8
Bu yanıtta belirtildiği gibi , "Bunu dizin ağacı için yapamazsınız." ifade doğru değil.
Mandark

164

@Dmytrii'nin bunu bir yandan doğru yaptığına inanıyorum - "bağlantı" özelliğini kullanmak istiyorsunuz.

Ancak, bir dizin ağacına bağlanamayacağınızı söylerken yalnızca kısmen haklıdır. Bu, Visual Studio'nun GUI'sini kullanarak bağlantıları eklemeye çalışırken gerçekten doğru olsa da, MSBuild bunu destekler.

Dizin yapısını korumak istiyorsanız %(RecursiveDir), <link>düğümünüze etiketi eklemeniz yeterlidir:

<Content Include="..\..\MyContentFiles\**\*.*">
  <Link>%(RecursiveDir)%(Filename)%(Extension)</Link>
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>

MSBuild Tanınmış Öğe Meta Verileri sayfası , erişebileceğiniz meta veriler hakkında daha ayrıntılı bilgi verir.


1
1) Paylaşılan Varlıklar deposundan bir dosya silinirse ne olur? Çözüm Dizini'nden silinecek gibi görünmüyor 2) Çalıştırma tamamlandıktan sonra Visual Studio'nun bu dosyaları $ (SolutionDir) öğesinden silmesini sağlamanın herhangi bir yolu var mı? Onları orada bırakmak diğer geliştiricilerin kafasını karıştırabilir.
Adam

@Adam Aşağıdaki cevabımı görün
Robin van der Knaap

9
Vahşi doğada çok az yiyecek, su ve arkadaşlığa güçlü bir ihtiyaç duyduğum için bu cevabı faydalı buluyorum. Bu talimatları izleyerek, bir zamanlar buradaki vahşi doğada beni rahatsız eden tüm insan ihtiyaçlarının yerini alan tamamen işlevsel bir yapay zeka oluşturabildim. Teşekkürler Mandark!
deepelement

1
@Vijay düzenlememi gör, ihtiyacın var <Content Include="..\..\MyContentFiles\**\*.*">- \*.*yolun sonuna dikkat et .
CAD bloke

3
VS2017'de (15.8.6) .NET Core projesi için çalışmıyor.
zwcloud

29

Mandark'ın cevabı , içerik dosyalarını doğrudan çözüme ekler ve bunlar çözüm gezgininde görünecektir. Orijinal dizine bir dosya eklendiğinde veya silindiğinde, bu görsel stüdyo tarafından otomatik olarak alınmaz. Ayrıca, çözüm gezginine bir dosya silindiğinde veya eklendiğinde, proje dosyası değiştirilir ve tüm dosyalar yalnızca klasörü dahil etmek yerine ayrı olarak dahil edilir.

Bunu önlemek için aynı numarayı kullanabilirsiniz, ancak onu ayrı bir proje dosyasına koyabilir ve sonra içe aktarabilirsiniz.

Proje dosyası (örneğin include.proj) şöyle görünür:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Content Include="..\..\MyContentFiles\**">
  <Link>%(RecursiveDir)%(Filename)%(Extension)</Link>
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
</Project>

Kendi proje dosyanıza aşağıdaki satırı ekleyin

<Import Project="include.proj" />

Visual Studio bu dosyayla uğraşmaz ve derleme sırasında dosyaları içerik olarak ekler. Orijinal dizindeki değişiklikler her zaman dahil edilir. Dosyalar çözüm gezgininizde görünmeyecek, ancak çıktı dizinine eklenecektir.

Bu numarayı buradan aldık: http://blogs.msdn.com/b/shawnhar/archive/2007/06/06/wildcard-content-using-msbuild.aspx


1
Bazı nedenlerden dolayı, bu bir .proj dosyası kullanarak benim için işe yaramadı, ancak bir .csproj dosyasıyla çalışmasını sağladım.
StriplingWarrior

6
Öğelerin Çözüm Gezgini'nde görünmesini sağlamak için İçerik öğesine <Visible> true </Visible> ekleyebilirsiniz.
Michael Baker

Benimki sadece bir .proj ile tamamdı
Jason Dufair

Bu benim için hiç işe yaramadı ve bunun, bağlanacak öğelerin kendilerinin bir inşa öncesi olayda oluşturulmuş olmasından kaynaklandığını varsayıyorum.
Paul K

2
VS2017'de (15.8.6) .NET Core projesi için çalışmıyor.
zwcloud

11

Proje dosyanızın altına ekleyeceğiniz aşağıdakiler, derleme sonrası bir olaydaki dizin yapısını koruyan içerik dosyalarınızı derlemenizin hedef dizinine $(TargetDirectory)(tipik olarak $(MSBuildProjectDirectory)\bin\Debug) kopyalayacaktır .

<ItemGroup>
    <ExtraContent Include="$(MSBuildProjectDirectory)\..\..\MyContentFiles\**" />
</ItemGroup>

<Target Name="AfterBuild">
    <Copy 
        SourceFiles="@(ExtraContent)" 
        DestinationFiles="@(ExtraContent->'$(TargetDir)\%(RecursiveDir)%(Filename)%(Extension)')" 
        SkipUnchangedFiles="true" />
</Target>

Bu dosyaların MyContentFiles adlı bir dizine gitmesi gerekiyorsa, bunu kopyadan önce ekleyebilirsiniz:

<MakeDir Directories="$(TargetDir)\MyContentFiles" Condition=" !Exists('$(TargetDir\MyContentFiles') " />

ve değişim

<Copy 
            SourceFiles="@(ExtraContent)" 
            DestinationFiles="@(ExtraContent->'$(TargetDir)\%(RecursiveDir)%(Filename)%(Extension)')" 
            SkipUnchangedFiles="true" />

İçin

<Copy 
            SourceFiles="@(ExtraContent)" 
            DestinationFiles="@(ExtraContent->'$(TargetDir)\MyContentFiles\%(RecursiveDir)%(Filename)%(Extension)')" 
            SkipUnchangedFiles="true" />

1
Dönüşümlerinizin bir türü-o: @ (ExtraContent) -> '...') @ (ExtraContext -> '...') olmalıdır. Aksi takdirde iyi cevap!
alexdej

@Todd 1) MyContentFiles deposundan bir dosya silinirse ne olur? Çözüm Dizini'nden silinecek gibi görünmüyor 2) Çalıştırma tamamlandıktan sonra Visual Studio'nun bu dosyaları $ (SolutionDir) öğesinden silmesini sağlamanın herhangi bir yolu var mı? Onları orada bırakmak diğer geliştiricilerin kafasını karıştırabilir.
Adam

İhtiyacım olan buydu. Proje ve inşa süreci artık beklendiği gibi çalışıyor, ancak dosyalar bir kez tıklama uygulamasıyla yayınlanmıyor. Bunun için herhangi bir ipucu var mı?
Georg W.

4

bence

<Content Include="..\..\MyContentFiles\**\*.*">
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>

Bu klasördeki ve alt klasörlerdeki her şeyi istediğiniz için yeterli


2

Bir .NET Core projesi için bir klasöre dosya eklemek için,

<!--Just files-->
<ItemGroup>
  <None Update="..\..\MyContentFiles\**\*.*">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </None>
</ItemGroup>
<!--Content files-->
<ItemGroup>
  <Content Include="..\..\MyContentFiles\**\*.*" Link="MyContentFiles\%(RecursiveDir)%(Filename)%(Extension)">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Content>
</ItemGroup>

Ve öğelerin "Çıktı Dizinine Kopyala" özelliği "Daha yeniyse kopyala" olacaktır:
Daha yeniyse kopyala


-1

Net Core projesindeki bir dosyayı yok saymak için:

<ItemGroup>
 <Content Include="appsettings.local.json">
   <CopyToOutputDirectory Condition="Exists('appsettings.local.json')">PreserveNewest</CopyToOutputDirectory>
 </Content>
</ItemGroup>
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.