linter 规则——不允许硬编码输出

该规则会找到使用硬编码的文字值而非导出变量的输出声明。

注释

此规则默认关闭。 在 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