Dosyaları csproj dotnetcore kullanarak çıktı dizinine kopyalayın


104

Yani sorunum oldukça basit. Bir hata ayıklama derlemesi veya bir yayın yayını olsun, yapı çıktı dizinine kopyalanmasını istediğim bazı dosyalarım var. Bulabildiğim tüm bilgiler eski json yapılandırma yaklaşımı hakkındadır. Dotnetcore ile csproj kullanan bir örnek var mı?

Yanıtlar:


144

İhtiyaçlarınızın ne olduğuna bağlı olarak hedeflerinize ulaşmanın epeyce yolu vardır.

En kolay yaklaşım, meta veri ( CopyToOutputDirectory/ CopyToPublishDirectory) öğelerini koşullu olarak ayarlamaktır ( işe yaramazsa bunun yerine deneyin yerine .txtbir Noneöğe olduğunu varsayarak ):Content<Content>

<ItemGroup Condition="'$(Configuration)' == 'Debug'">
  <None Update="foo.txt" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>

Daha fazla kontrol gerekiyorsa, en çok yönlü yaklaşım csproj dosyasındaki derleme sürecine bağlanan özel hedefler eklemektir:

<Target Name="CopyCustomContent" AfterTargets="AfterBuild">
  <Copy SourceFiles="foo.txt" DestinationFolder="$(OutDir)" />
</Target>
<Target Name="CopyCustomContentOnPublish" AfterTargets="Publish">
  <Copy SourceFiles="foo.txt" DestinationFolder="$(PublishDir)" />
</Target>

Bu, bir dosyayı ilgili dizinlere kopyalar. Görevle ilgili daha fazla seçenek için belgelerine<Copy> bakın . Bunu belirli yapılandırmalarla sınırlamak için bir öznitelik kullanabilirsiniz :Condition

<Target … Condition=" '$(Configuration)' == 'Release' ">

Bu Conditionöznitelik hem <Target>öğeye hem de gibi görev öğelerine uygulanabilir <Copy>.


'DestinationFolder' öğesini <Reference> öğelerine nasıl uygularım veya olay mümkün mü, belgelerde bulabileceğim pek bir şey yok. Tüm derlemelerimin kök seviyesinde olmasını istemiyorum ve kendi klasörlerinde olmalarını tercih ederim.
Reahreic

DestinationSubDirectory="subdir\"Meta verileri Referencedoğrudan öğeler üzerinde ayarlayabilirsiniz . Ancak bu, montaj çözümünü kendiniz uygulamanız gerektiği anlamına gelir ( AssemblyResolve etkinliği )
Martin Ullrich

İlgili klasörlerde bazı dll'leri içeren ana klasörü nasıl kopyalayabilirim. Bu dll'leri başlangıçta eklenti olarak yüklerken, bu klasörleri oluşturduktan sonra çalışma zamanında uygulamam için kullanılabilir olacak şekilde bunları çıktı yayımlanan yolunda kullanılabilir hale getirmek istiyorum. Mac'te rider kullanıyorum
kuldeep

93

Bu, sorunumu çözmeme yardımcı olsa da, bir alt dizindeki tüm dosyalar için çalışmadı. Ben de Content Includeyerine kullandım Content Update;

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <Content Include="layouts\*.*">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>  
  </ItemGroup>

</Project>

3
Diğer tüm cevapların / önerilerin diğer tüm permütasyonları benim için işe yaramadı. Ayrıntılı derleme çıktısında dosyadan hiç bahsedilmiyor. Ama buradaki öneriniz işe yaradı.
user7817808

15
Ara alt klasörleri dahil etmek istiyorsanız şunu kullanın<Content Include="layouts\**\*.*">
JSancho

3
Web SDK ( <Project Sdk="Microsoft.NET.Sdk.Web">) kullanılırken kullanmanıza izin vermez, Include=çünkü zaten bunu SDK içinde örtük olarak belirtiyor gibi görünmektedir. Update=Ek dosyalarımı oluşturmak ve eklemek için onu kullanmak zorunda kaldım.
notracs

Güzel, teşekkürler .. Ama sadece klasörün içeriğini klasörün kendisine değil çıktı dizinine nasıl kopyalarsınız. İfade assets\*.*bunu varsaymalıdır. Ancak varlıklar klasörünün tamamını kopyalar. Bu yüzden var bin/Debug/netcoreapp3.1/assets/...Ama varlıklar klasörünün dosyalarını çıktının kök dizinine istiyorum. bin/Debug/netcoreapp3.1/....
Dominik

Bir çözüm buldum: xml <Project Sdk="Microsoft.NET.Sdk"> <ItemGroup> <AssetsSourceFiles Include="assets/**/*.*"/> </ItemGroup> <Target Name="CopyCustomContent" AfterTargets="AfterBuild"> <Copy SourceFiles="@(AssetsSourceFiles)" DestinationFolder="$(OutDir)" SkipUnchangedFiles="true" /> </Target> </Project> (daha iyi bir kod formatı
Dominik

15

Bunu, .csproj dosyanıza, nlog.config'i istenen dosya yolu ile değiştirerek yerleştirin. Ardından kaydedin ve projenizi oluşturun:

<ItemGroup>
  <Content Update="Nlog.config">
    <CopyToOutputDirectory>Always</CopyToOutputDirectory>
  </Content>
</ItemGroup>

Bu, alt dizinleri kopyalıyor gibi görünmüyor.
boş

13

assetsKök dizininizde bir klasörünüz olduğunu varsayarsak . İstediğiniz gibi adlandırabilirsiniz. Bu sadece bir örnek:

projeniz.csproj

<Project Sdk="Microsoft.NET.Sdk">
  <ItemGroup>
    <AssetsSourceFiles Include="assets/**/*.*"/>
  </ItemGroup>

  <Target Name="CopyCustomContent" AfterTargets="AfterBuild">
    <Copy SourceFiles="@(AssetsSourceFiles)" DestinationFolder="$(OutDir)" SkipUnchangedFiles="true" />
  </Target>
</Project>

bu, assetsklasörün içine sarmadan yalnızca klasör içeriğini çıktı köküne kopyalar assets. Ancak klasörün kendisiyle kopyalamak istiyorsanız, aşağıdaki kodu kullanabilirsiniz:

<Project Sdk="Microsoft.NET.Sdk">
  <ItemGroup>
    <Content Include="assets\**\*.*">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
  </ItemGroup>
</Project>

3

Hem istemci tarafında hem de sunucu tarafında tüketilebilir olması için bir dizi HTML şablonuna ihtiyacım vardı (Handlebars js)

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <Content Update="wwwroot\html-templates\**\*.*">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
  </ItemGroup>

</Project>

0

Günümü kurtardığın için teşekkürler, belirli bir nuget paketinin kopyasını bir asp.net çekirdek projesine (2.2) zorlamanız gerekiyorsa, csproj'unuzun sonuna ekleyin:

<!-- Force copy MathNet because we need it in compilation -->
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="Build">
    <PropertyGroup>
        <ErrorText>This project references NuGet package(s) that are missing on this computer. The missing file is {0}.</ErrorText>
    </PropertyGroup>
    <Error Condition="!Exists('..\packages\MathNet.Numerics.4.8.1\lib\netstandard2.0\MathNet.Numerics.dll')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MathNet.Numerics.4.8.1\lib\netstandard2.0\MathNet.Numerics.dll'))" />
</Target>

<ItemGroup>
    <ContentWithTargetPath Include="..\packages\MathNet.Numerics.4.8.1\lib\netstandard2.0\MathNet.Numerics.dll">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <TargetPath>MathNet.Numerics.dll</TargetPath>
    </ContentWithTargetPath>
</ItemGroup>

0
<PropertyGroup>
    <PostBuildEvent>xcopy "$(ProjectDir)Xml" "$(ProjectDir)$(OutDir)Xml" /S /F /I /R /Y</PostBuildEvent>
</PropertyGroup>

veya

<PropertyGroup>
    <PostBuildEvent>copy /Y "$(ProjectDir)MyXml.xml" "$(ProjectDir)$(OutDir)Xml"</PostBuildEvent>
</PropertyGroup>

1
İdeal olarak, çapraz platform yapmak için bir <Copy> görevi kullanın.
Bruno Garcia
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.