我的问题非常简单。我有一些文件,希望无论是调试构建还是发布版本,在构建输出目录中都能将它们复制过去。所有我找到的信息都是关于旧的json配置方法的。请问是否有使用dotnetcore的csproj示例?
根据您的需求,有很多方法可以实现您的目标。
最简单的方法是有条件地设置元数据 (CopyToOutputDirectory
/ CopyToPublishDirectory
) 项目(假设.txt
是一个None
项目而不是Content
,如果它不起作用,请尝试使用<Content>
):
<ItemGroup Condition="'$(Configuration)' == 'Debug'">
<None Update="foo.txt" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
如果需要更多的控制,最灵活的方法是在csproj文件中添加自定义目标以钩入构建过程:
<Target Name="CopyCustomContent" AfterTargets="AfterBuild">
<Copy SourceFiles="foo.txt" DestinationFolder="$(OutDir)" />
</Target>
<Target Name="CopyCustomContentOnPublish" AfterTargets="Publish">
<Copy SourceFiles="foo.txt" DestinationFolder="$(PublishDir)" />
</Target>
这将文件复制到各自的目录中。有关 <Copy>
任务的更多选项,请参阅其文档。要将其限制为某些配置,您可以使用 Condition
属性:
<Target … Condition=" '$(Configuration)' == 'Release' ">
这个条件(Condition)
属性可以应用于<Target>
元素或类似<Copy>
的任务元素。
虽然这帮助我解决了我的问题,但它并没有对子目录中的所有文件起作用。我还使用了Content Include
而不是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>
<Content Include="layouts\**\*.*">
。 - JSancho<Project Sdk="Microsoft.NET.Sdk.Web">
)时,不能使用 Include=
,因为它似乎已经在SDK中隐含地指定了它。我不得不使用Update=
来构建并包含我的其他文件。 - notracsassets\*.*
应该可以做到这一点。但它会复制整个assets文件夹。所以我有了bin/Debug/netcoreapp3.1/assets/...
,但我想要将assets文件夹中的文件复制到输出的根目录中。bin/Debug/netcoreapp3.1/...
。 - Domske
(请查看我的答案以获取更好的代码格式。) - Domske<None Update="layouts\*.*>
才能让我的工作正常。 - nedstark179assets
的文件夹,您可以根据需要命名。这只是一个示例:
your-project.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>
这个代码将只复制 assets
文件夹的内容到输出目录,而不会将其包装为 assets
文件夹。但如果你想连同文件夹一起复制,可以使用以下代码:
这段代码会将整个 assets
文件夹及其内容复制到输出目录:
<Project Sdk="Microsoft.NET.Sdk">
<ItemGroup>
<Content Include="assets\**\*.*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
</Project>
将此代码放置在您的.csproj文件中,将nlog.config替换为所需的文件路径。然后保存并构建您的项目:
<ItemGroup>
<Content Update="Nlog.config">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
我需要一些HTML模板,既可以在客户端使用,也可以在服务器端使用(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>
<ItemGroup>
<None Include="test.txt">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
<ItemGroup>
<Content
Include="..\libs\x64\**\*.*"
CopyToOutputDirectory="Always"
TargetPath="x64\%(Filename)%(Extension)"
/>
</ItemGroup>
<ItemGroup>
<PackageReference Include="PackageName" Version="PackageVersion" />
</ItemGroup>
<!-- 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>
<PropertyGroup>
<PostBuildEvent>xcopy "$(ProjectDir)Xml" "$(ProjectDir)$(OutDir)Xml" /S /F /I /R /Y</PostBuildEvent>
</PropertyGroup>
或者
<PropertyGroup>
<PostBuildEvent>copy /Y "$(ProjectDir)MyXml.xml" "$(ProjectDir)$(OutDir)Xml"</PostBuildEvent>
</PropertyGroup>
Reference
项上设置DestinationSubDirectory="subdir\"
元数据。但是这意味着您需要自己实现程序集解析(AssemblyResolve事件)。 - Martin Ullrich.csproj
文件中的PreBuild步骤之外不存在。您将遇到一个鸡生蛋的问题,其中构建代理“错过”文件。这可能与构建步骤期间提供的警告有关:https://learn.microsoft.com/en-us/azure/devops/pipelines/tasks/build/dotnet-core-cli?view=azure-devops#troubleshooting - Nathan Goings