我希望嵌入 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"
,但它似乎还不够。
有办法做到这一点吗?
如果我正确理解了 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 包都必须在标记中单独引用。
这应该有效。
<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
“触发”该目标