从 dotnet 发布中排除 css 个隔离资产

Exclude css isolation assets from dotnet publish

我正在使用 RazorPages(在 ASP.NET Core 6 上)和 css 隔离功能。 css 文件在 obj/{Debug,Release}/net6.0/scopedcss/Pages/ 处生成,并在执行 dotnet publish.

时包含在内

我也使用 Webpack,所以我不需要发布那些 css 文件(它们已经被 Webpack 捆绑)。

我将所有这些的变体添加到我的 Project.csproj 但没有成功:

<ItemGroup>
  <Content Remove="obj/*/*/scopedcss/**/*" />
</ItemGroup>
<ItemGroup>
  <Content Remove="*.cshtml.rz.scp.css" />
</ItemGroup>
<ItemGroup>
  <None Remove="obj/*/*/scopedcss/**/*" />
</ItemGroup>
<ItemGroup>
  <Compile Remove="*.cshtml.rz.scp.css" />
</ItemGroup>
<ItemGroup>
  <PublishedFiles Remove="obj/*/*/scopedcss/**/*" />
</ItemGroup>
<PropertyGroup>
  <DefaultItemExcludes>$(DefaultItemExcludes);obj/*/*/scopedcss/**/*</DefaultItemExcludes>
</PropertyGroup>

如何从发布的输出中排除 css 隔离资产?

更新
我找到了控制它的 msbuild 东西,但不知道如何防止它在发布期间被复制。这个bit in the SDK imports the feature's msbuild targets, which are here and here.

这是 unsupported for now,但会在 net7 中实现(希望如此)。

使用“私有”属性的解决方法:

<Target Name="_RemoveScopedCssFiles" AfterTargets="_AddGeneratedScopedCssFiles">
  <ItemGroup>
    <StaticWebAsset Remove="@(StaticWebAsset)" Condition="$([System.String]::Copy('%(Identity)').EndsWith('rz.scp.css'))">
  </ItemGroup>
</Target>

我不太愿意使用它,因为它不是 public 合同/接口的一部分。不过它可能适合你。

一个缓慢而丑陋但安全的解决方法是让运行时发布文件,然后删除它们:

<Target Name="DeleteScopedCssAssetsAfterPublish" AfterTargets="AfterPublish">
  <RemoveDir Directories="$(PublishUrl)/wwwroot/Pages" />
</Target>