如何嵌入 Razor 类库生成的作用域 css 捆绑文件?

问题描述 投票:0回答:2

我希望嵌入 razor 类库项目生成的作用域 css 捆绑文件。该文件在构建时放置在 obj 文件夹中。我面临着定义正确的 msbuild 目标以在构建过程中在正确的时间发出嵌入资源的挑战。

深入研究 dotnet 目标文件后,这就是我目前在 .csproj 文件中的内容。

<Target Name="EmbedScopedCss" BeforeTargets="BeforeResGen" AfterTargets="BundleScopedCssFiles">
    <ItemGroup>
        <EmbeddedResource Include="$(IntermediateOutputPath)scopedcss\bundle\$(PackageId).styles.css" Type="Non-Resx" WithCulture="false" />
    </ItemGroup>
</Target>

这应该使嵌入式资源项在

BeforeResGen
目标之前发出,据我所知,这是枚举资源以嵌入程序集之前的最后一刻。

但是,这在构建过程中似乎仍然运行得太早,因为此时文件本身还不存在。

我从 razor sdk 范围内的 css 目标文件推断出

AfterTargets="BundleScopedCssFiles"
,但它似乎还不够。

有办法做到这一点吗?

css asp.net-core razor msbuild blazor
2个回答
0
投票

如果我正确理解了 MSBuild 日志,则在编译项目的程序集后,将调用负责当前项目的 CSS 捆绑包生成的目标。

我个人已经通过使用单独的 Razor 类库项目来存储具有作用域样式表的所有组件来解决这个问题。然后我在主项目的

.styles.css
文件中将其生成的
EmbeddedResource
文件标记为
.csproj

  <PropertyGroup>
    <!-- Disable CSS bundle generation for the main project as we cannot embed it -->
    <DisableScopedCssBundling>true</DisableScopedCssBundling>

    <!-- Define the base namespace for embedded CSS bundles -->
    <ScopedCssEmbeddedResourceNamespace>$(RootNamespace).wwwroot</ScopedCssEmbeddedResourceNamespace>
  </PropertyGroup>

  <Target Name="EmbedScopedCssBundles" AfterTargets="BundleScopedCssFiles" BeforeTargets="MainResourcesGeneration">
    <!-- Search for generated *.styles.css files for the current build configuration in neighbor projects and embed them -->
    <ItemGroup>
      <ScopedCssBundle Include="$(ProjectDir)../**/$(Configuration)/**/scopedcss/bundle/*.styles.css" />
      <ScopedCssEmbeddedResource Include="@(ScopedCssBundle)"
                                 ResourceName="$(ScopedCssEmbeddedResourceNamespace).%(Filename)%(Extension)" />
      <EmbeddedResource Include="@(ScopedCssEmbeddedResource)"
                        LogicalName="%(ScopedCssEmbeddedResource.ResourceName)" />
    </ItemGroup>

    <!-- Optional messages for MSBuild log -->
    <Message Condition="'@(ScopedCssEmbeddedResource)' == ''"
             Text="No scoped CSS bundles found for $(Configuration) configuration" />
    <Message Condition="'@(ScopedCssEmbeddedResource)' != ''"
             Text="Embedding scoped CSS bundles for $(Configuration) configuration:" />
    <Message Condition="'@(ScopedCssEmbeddedResource)' != ''"
             Text="  %(ScopedCssEmbeddedResource.Identity) -> %(ScopedCssEmbeddedResource.ResourceName)" />
  </Target>

如果主项目名为

MyProject
并且相邻的 Razor 类库项目名为
MyProject.RazorLib
,则上述作用域 CSS 束中的代码将嵌入到主项目的程序集中,名称为
MyProject.wwwroot.MyProject.RazorLib.styles.css

这种方法的缺点是每个嵌入的 CSS 包都必须在标记中单独引用。


0
投票

这应该有效。

<Target Name="EmbedScopedCss" BeforeTargets="ResolveAssemblyReferences" DependsOnTargets="BundleScopedCssFiles">
    <ItemGroup>
        <EmbeddedResource Include="$(IntermediateOutputPath)scopedcss\bundle\$(AssemblyName).styles.css" LogicalName="$(AssemblyName).styles.css" />
    </ItemGroup>
</Target>

EmbeddedResource
需要在
ResolveAssemblyReferences
之前存在,但捆绑包是在
BundleScopedCssFiles
处生成的。因此
AfterTargets
不起作用,您需要通过
DependsOnTargets

“触发”该目标
© www.soinside.com 2019 - 2024. All rights reserved.