.NET Core NuGet包 - 将文件复制到包消费者的wwwroot目录

7
我有一个.Net Core 2.2库项目。该项目只包含一堆“生成操作”设置为Content的静态文件。
该项目的唯一目的是构建成Nuget软件包,并使任何消费者将所包含的内容添加到其wwwroot文件夹中。
不幸的是,当查看解决方案资源管理器时,这些文件“似乎”存在,但它们的实际路径是:
C:\Users\MyName\.nuget\package\mylib.staticfiles\0.0.1\contentFiles\any\netcoreapp2.2\wwwroot。
在我的库中,我在.csproj文件中使用了以下内容:
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netcoreapp2.2</TargetFramework>
    <PackageVersion>0.0.6</PackageVersion>
  </PropertyGroup>
  <ItemGroup>
    <Content Include="wwwroot\**" />
  </ItemGroup>

</Project>

我很难找到关于如何完成这项任务的文档。任何帮助都将不胜感激。


使用Razor类库。这样,您实际上可以将静态资源嵌入到库中。它们仍然不会包含在目标项目中(尽管这是最好的)。如果使用者想要更改或修改静态文件,他们只需在其项目中同一位置创建具有相同名称的文件,它就可以作为覆盖来实现。您的方法存在问题,因为对NuGet软件包的任何更新都将覆盖项目中的任何更改,而使用RCL,则由使用者控制。 - Chris Pratt
3个回答

3
是的,它不能工作了。新的方式是链接文件。静态内容和代码文件以前会被复制到目标项目中,但这种方式不再支持。它被认为是“污染”项目。 有一种方法可以进行黑客攻击,虽然不完美但是可行的。请查看我的答案这里。 希望能有所帮助。

0
在你的NuGet项目根目录下创建一个名为YourProjectName.targets的文件,并添加以下内容:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <Target Name="CopyScriptsToProject" BeforeTargets="Build">
      <Message Text="Copying wwwroot to your project.." />  
         <ItemGroup>
            <SourceScripts Include="$(MSBuildThisFileDirectory)..\staticwebassets\**\*.*"/>
         </ItemGroup>
         <Copy 
            SourceFiles="@(SourceScripts)"
            DestinationFiles="@(SourceScripts -> '$(MSBuildProjectDirectory)\wwwroot\%(RecursiveDir)%(Filename)%(Extension)')"
            Condition="!Exists('$(MSBuildProjectDirectory)\wwwroot\%(RecursiveDir)%(Filename)%(Extension)')"
         />
   </Target> 
</Project>

将以下内容添加到您的项目文件(.cproj)中:
  <ItemGroup>
    <Content Include="YourProjectName.targets" PackagePath="build/YourProgectName.targets" />   
  </ItemGroup>

构建并打包您的NuGet项目。将NuGet安装到B项目中。现在构建B项目,您将在B项目的wwwroot文件夹中找到来自NuGet wwwroot的所有文件。


0
Nick,这个真的很好用,但是我升级到.NET 6之后就出现了问题。
##[error]C:\Program Files\dotnet\sdk\6.0.301\Sdks\Microsoft.NET.Sdk.Razor\targets\Microsoft.NET.Sdk.Razor.StaticWebAssets.targets(442,5): Error : Two assets found targeting the same path with incompatible asset kinds: 
'C:\Users\VssAdministrator\.nuget\packages\XXXXX\2802.0.0\contentFiles\any\net6.0\wwwroot\brand\css\base.css' with kind 'All'
'D:\a\1\s\XXXXXXX\wwwroot\brand\css\base.css' with kind 'All'
for path 'brand/css/base.css'


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接