如何禁用.NET 8 Blazor Web App中Razor类库隔离样式表的哈希生成
我有一个名为Contoso的.NET 8 Blazor Web应用,包含两个Razor类库:LibA与应用在同一Visual Studio解决方案中,LibB则属于另一个独立解决方案。启动应用时,系统会动态生成整合所有库样式的Contoso.styles.css,其中的导入语句如下:
@import '_content/LibA/LibA.bundle.scp.css'; @import '_content/LibB/LibB.ca3u9u6gjt.bundle.scp.css';
LibB这类外部库的样式表文件名带有动态哈希标识(如ca3u9u6gjt),每次库更新且样式变更时哈希都会改变。由于需要直接指定固定文件名来保证样式加载顺序,且不想每次更新都修改文件名,因此需要禁用该哈希生成行为(此行为从.NET 8开始出现)。
已尝试的操作
在Web应用和LibB的.csproj文件中添加以下配置,但未生效:
<PropertyGroup> <CssScopedGenerateSourceHash>false</CssScopedGenerateSourceHash> </PropertyGroup>
更新说明
通过Visual Studio的Package Manager Console执行dotnet pack生成LibB的包时,能得到不带哈希的LibB.bundle.scp.css;但通过Azure DevOps Pipeline中的DotNetCoreCLI@2任务执行pack命令时,生成的包仍会给样式表文件名添加哈希。
解决方案
1. 确保类库项目配置覆盖所有构建场景
在LibB的.csproj中,将配置明确绑定到Release构建配置(Azure DevOps Pipeline通常默认使用Release配置打包),或者设置为全局生效:
<!-- 针对Release配置生效 --> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> <CssScopedGenerateSourceHash>false</CssScopedGenerateSourceHash> </PropertyGroup> <!-- 或者全局所有配置生效 --> <PropertyGroup> <CssScopedGenerateSourceHash>false</CssScopedGenerateSourceHash> </PropertyGroup>
2. 在Azure DevOps Pipeline中显式传递属性
修改Pipeline中的DotNetCoreCLI@2打包任务,在arguments参数中强制指定禁用哈希生成的属性,确保打包过程读取该配置:
- task: DotNetCoreCLI@2 inputs: command: 'pack' packagesToPack: '**/LibB.csproj' versioningScheme: 'off' # 根据实际需求调整版本策略 arguments: '/p:CssScopedGenerateSourceHash=false'
3. 验证结果
打包完成后,解压生成的nupkg包,检查content目录下的样式文件是否为LibB.bundle.scp.css;将该包引用到Contoso应用后,启动应用查看Contoso.styles.css中的导入语句,确认LibB的样式路径已无哈希标识。
内容的提问来源于stack exchange,提问作者cpt.oneeye

