该规则会找到使用硬编码的文字值而非导出变量的输出声明。
注释
此规则默认关闭。 在 bicepconfig.json 里更改电平以启用它。
Linter 规则代码
请在 Bicep 配置文件中使用以下值自定义规则设置:
no-hardcoded-outputs
解决方案
当输出返回硬编码常量——而非计算值或运行时值时——该常数更适合用导出变量来表示。 导出的变量可以被其他 Bicep 文件直接导入,使意图更清晰,避免不必要的部署以获取固定值。
以下类型的输出值触发了该规则:字符串文字、整数文字、布尔文字、空值、数组以及每个元素都是文字值的对象。
引用参数、使用字符串插值或调用函数的输出不会触发此规则。
以下示例未通过此测试,因为输出返回字符串字面量:
output apiVersion string = '2024-01-01'
你可以用导出的变量替换输出来解决:
@export()
var apiVersion = '2024-01-01'
以下示例同样未通过此测试,因为数组中的每个元素和对象中的每个属性值都是文字:
param name string
output stringValue string = 'literal'
output intValue int = 42
output boolValue bool = true
output arrayValue array = [
'one'
2
]
output objectValue object = {
first: 'one'
nested: [
false
]
}
你可以通过将每个输出转换为导出变量来修复这些问题:
@export()
var stringValue = 'literal'
@export()
var intValue = 42
@export()
var boolValue = true
@export()
var arrayValue = [
'one'
2
]
@export()
var objectValue = {
first: 'one'
nested: [
false
]
}
以下示例通过了此测试,因为输出引用参数或使用表达式:
param name string
output reference string = name
output interpolated string = 'literal-${name}'
output functionResult string = toLower('LITERAL')
output arrayWithExpression array = [
'literal'
name
]
output objectWithExpression object = {
literal: 'literal'
reference: name
}
使用 快速修复 自动创建同名导出变量,并删除硬编码输出。 如果变量名与已有声明冲突,快速修复会在变量名后附加一个数字。
从其他文件导入导出的常量
一旦你把硬编码输出转换成导出的变量,其他 Bicep 文件就可以直接用该import语句导入它。 这样就避免了仅仅为了读取常数值而部署模块。
以下示例定义了共享 constants.bicep 文件中的常量:
// constants.bicep
@export()
var apiVersion = '2024-01-01'
@export()
var maxRetries = 3
另一个 Bicep 文件可以直接导入这些常量:
import { apiVersion, maxRetries } from './constants.bicep'
resource storageAccount 'Microsoft.Storage/storageAccounts@2025-01-01' = {
name: 'mystorageaccount'
location: resourceGroup().location
kind: 'StorageV2'
sku: {
name: 'Standard_LRS'
}
properties: {
minimumTlsVersion: 'TLS1_2'
}
tags: {
apiVersion: apiVersion
}
}
欲了解更多信息,请参见 导入用户自定义数据类型、变量和函数。
后续步骤
有关 Linter 的详细信息,请参阅使用 Bicep Linter。