Определяемые пользователем функции в Bicep

В файле Bicep можно создать собственные функции. Эти функции доступны для использования в файлах Bicep. Определяемые пользователем функции отличаются от стандартных функций Bicep, которые автоматически доступны в файлах Bicep. Создайте собственные функции при наличии сложных выражений, которые многократно используются в файлах Bicep. Использование определяемых пользователем функций автоматически включает создание кода версии 2.0 .

Для использования этой функции требуется интерфейс командной строки Bicep версии 0.26.X или более поздней .

Ограничения

При определении пользовательской функции существуют некоторые ограничения:

  • Функция не может обращаться к переменным.
  • Функция может использовать только параметры, определенные в самой функции.
  • Функция не может использовать эталонную функцию или любую функцию из списка функций.
  • Для параметров этой функции нельзя задавать значения по умолчанию.

Определение функций

Используйте инструкцию func для определения определяемых пользователем функций.

@<decorator>(<argument>)
func <user-defined-function-name> (<argument-name> <data-type>, <argument-name> <data-type>, ...) <function-data-type> => <expression>

Примеры

В следующих примерах показано, как определить и использовать определяемые пользователем функции:

func buildUrl(https bool, hostname string, path string) string => '${https ? 'https' : 'http'}://${hostname}${empty(path) ? '' : '/${path}'}'

func sayHelloString(name string) string => 'Hi ${name}!'

func sayHelloObject(name string) object => {
  hello: 'Hi ${name}!'
}

func nameArray(name string) array => [
  name
]

func addNameArray(name string) array => [
  'Mary'
  'Bob'
  name
]

output azureUrl string = buildUrl(true, 'microsoft.com', 'azure')
output greetingArray array = map(['Evie', 'Casper'], name => sayHelloString(name))
output greetingObject object = sayHelloObject('John')
output nameArray array = nameArray('John')
output addNameArray array = addNameArray('John')

Выходные данные из предыдущих примеров:

Имя. Тип значение
azureUrl Строка https://microsoft.com/azure
приветствиеArray Массив ["Hi Evie!", "Hi Casper!"]
greetingObject Object {"hello":"Привет Джон!"}
nameArray Массив ["Джон"]
addNameArray Массив ["Мэри", "Боб","Джон"]

При использовании интерфейса командной строки Bicep версии 0.23.X или более поздней вы можете вызвать другую определяемую пользователем функцию в определяемой пользователем функции. В предыдущем примере с определением sayHelloStringфункции можно переопределить функцию sayHelloObject следующим образом:

func sayHelloObject(name string) object => {
  hello: sayHelloString(name)
}

Определяемые пользователем функции поддерживают использование определяемых пользователем типов данных. Например:

@minValue(0)
type positiveInt = int

func typedArg(input string[]) positiveInt => length(input)

param inArray array = [
  'Bicep'
  'ARM'
  'Terraform'
]

output elements positiveInt = typedArg(inArray)

Выходные данные из предыдущего примера:

Имя. Тип значение
элементы positiveInt 3

Использование декораторов

Декораторы записываются в формате @expression и помещаются над объявлениями функций. В следующей таблице показаны доступные декораторы для функций.

Декоратор Аргумент Description
описание строка Укажите описания функции.
Экспорт ничего Указывает, что функция доступна для импорта другим файлом Bicep.
metadata объект Настраиваемые свойства для применения к функции. Может включать свойство "Описание", которое эквивалентно декоратору "Описание".

Декораторы находятся в пространстве имен sys. Если вам важно, чтобы декоратор не путался с другими элементами с таким же именем, добавьте к нему префикс sys. Например, если файл Bicep содержит переменную с именем description, необходимо добавить пространство имен sys при использовании декоратора описания .

Description

Чтобы добавить объяснение, добавьте описание в объявление функции. Например:

@description('The say hello function.')
func sayHelloString(name string) string => 'Hi ${name}!'

Текст в формате Markdown можно использовать для текста описания.

Экспорт (Export)

Используется @export() для совместного использования функции с другими файлами Bicep. Дополнительные сведения см. в разделе "Экспорт переменных", "типы" и "Функции".

Метаданные

Если у вас есть настраиваемые свойства, которые необходимо применить к определяемой пользователем функции, добавьте декоратор метаданных. В метаданных определите объект с настраиваемыми именами и значениями. Объект, заданный для метаданных, может содержать свойства с любым именем и типом.

Этот декоратор может использоваться для отслеживания сведений о функции, которая не имеет смысла добавлять в описание.

@description('Configuration values that are applied when the application starts.')
@metadata({
  source: 'database'
  contact: 'Web team'
})
type settings object

Когда вы предоставляете декоратор с свойством @metadata() , который конфликтует с другим декоратором, этот декоратор всегда имеет приоритет над всем в декораторе @metadata() . Таким образом, конфликтующее свойство в значении @metadata() является избыточным и будет заменено. Дополнительные сведения см. в разделе "Нет конфликтующих метаданных".

Следующие шаги