Bagikan melalui


Fungsi yang ditentukan pengguna di Bicep

Dalam file Bicep, Anda dapat membuat fungsi Anda sendiri. Fungsi-fungsi ini tersedia untuk digunakan dalam file Bicep Anda. Fungsi yang ditentukan pengguna terpisah dari fungsi Bicep standar yang secara otomatis tersedia dalam file Bicep Anda. Buat fungsi Anda sendiri saat Anda memiliki ekspresi rumit yang digunakan berulang kali dalam file Bicep Anda. Menggunakan fungsi yang ditentukan pengguna secara otomatis mengaktifkan pembuatan kode versi bahasa 2.0 .

Bicep CLI versi 0.26.X atau yang lebih tinggi diperlukan untuk menggunakan fitur ini.

Batasan

Ada beberapa batasan saat menentukan fungsi pengguna:

  • Fungsi tersebut hanya dapat menggunakan parameter yang ditentukan dalam fungsi.
  • Fungsi ini tidak dapat menggunakan fungsi referensi atau fungsi daftar apapun.
  • Parameter untuk fungsi tidak dapat memiliki nilai default.

Menentukan fungsi

func Gunakan pernyataan untuk menentukan fungsi yang ditentukan pengguna.

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

Contoh berikut menunjukkan cara menentukan dan menggunakan fungsi yang ditentukan pengguna:

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')

Output dari contoh sebelumnya adalah:

Nama Jenis Nilai
azureUrl string https://microsoft.com/azure
arraySalam Array ["Hai Evie!","Hai Casper!"]
objekSapaan Objek {"hello":"Hai John!"}
nameArray Array ["Yohanes"]
addNameArray Array ["Mary","Bob","John"]

Anda memiliki fleksibilitas untuk memanggil fungsi lain yang ditentukan pengguna dalam fungsi yang ditentukan pengguna. Dalam contoh sebelumnya, dengan definisi sayHelloStringfungsi , Anda dapat menentukan sayHelloObject ulang fungsi sebagai:

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

Dukungan fungsi yang ditentukan pengguna menggunakan jenis data yang ditentukan pengguna. Contohnya:

@minValue(0)
type positiveInt = int

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

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

output elements positiveInt = typedArg(inArray)

Output dari contoh sebelumnya adalah:

Nama Jenis Nilai
elemen positiveInt 3

Pada Bicep CLI versi 0.30.X, fungsi yang ditentukan pengguna dapat mengakses variabel yang ditentukan dalam file Bicep yang sama. Contoh berikut menunjukkan bagaimana fungsi yang ditentukan pengguna dapat mereferensikan variabel:

var greetingPrefix = 'Hello'

func greet(name string) string => '${greetingPrefix}, ${name}!'

output message string = greet('Azure')

Output dari contoh sebelumnya adalah:

Nama Jenis Nilai
pesan string Halo, Azure!

Dimulai dengan Bicep CLI versi 0.31.X, variabel yang diimpor dari file Bicep lain dapat diakses dalam fungsi yang ditentukan pengguna Anda, seperti variabel yang ditentukan secara lokal.

Misalkan Anda memiliki file Bicep bernama shared.bicep yang mengekspor variabel:

// shared.bicep
@export()
var sharedPrefix = 'Contoso'

Anda dapat mengimpor variabel ini ke file Bicep utama Anda dan menggunakannya di dalam fungsi yang ditentukan pengguna:

import shared from './shared.bicep'

func makeResourceName(suffix string) string => '${shared.sharedPrefix}-${suffix}'

output resourceName string = makeResourceName('storage')

Output dari contoh sebelumnya adalah:

Nama Jenis Nilai
resourceName string Penyimpanan Contoso

Untuk informasi selengkapnya tentang mengimpor variabel, lihat Mengekspor variabel, jenis, dan fungsi.

Menggunakan dekorator

Dekorator ditulis dalam format @expression dan ditempatkan di atas deklarasi fungsi. Tabel berikut ini memperlihatkan dekorator yang tersedia untuk fungsi.

Dekorator Argumen Deskripsi
deskripsi benang Berikan deskripsi untuk fungsi tersebut.
ekspor tidak ada Menunjukkan bahwa fungsi tersedia untuk diimpor oleh file Bicep lain.
metadata obyek Properti kustom untuk diterapkan ke fungsi. Dapat mencakup properti deskripsi yang setara dengan dekorator deskripsi.

Dekotaror berada dalam namespace layanan sys. Jika Anda perlu membedakan suatu dekorator dari item lainnya dengan nama yang sama, awali dekorator dengan sys. Misalnya, jika file Bicep Anda menyertakan variabel bernama description, Anda harus menambahkan namespace layanan sys saat menggunakan dekorator deskripsi .

Deskripsi

Untuk menambahkan penjelasan, tambahkan deskripsi ke deklarasi fungsi. Contohnya:

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

Teks berformat markdown dapat digunakan untuk teks deskripsi.

Ekspor

Gunakan @export() untuk berbagi fungsi dengan file Bicep lainnya. Untuk informasi selengkapnya, lihat Mengekspor variabel, jenis, dan fungsi.

Metainformasi

Jika Anda memiliki properti kustom yang ingin Anda terapkan ke fungsi yang ditentukan pengguna, tambahkan dekorator metadata. Dalam metadata, tentukan objek dengan nama dan nilai kustom. Objek yang Anda tentukan untuk metadata dapat berisi properti nama dan jenis apa pun.

Anda mungkin menggunakan dekorator ini untuk melacak informasi tentang fungsi yang tidak masuk akal untuk ditambahkan ke deskripsi.

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

Ketika Anda menyediakan @metadata() dekorator dengan properti yang bertentangan dengan dekorator lain, dekorator itu selalu lebih diutamakan daripada apa pun di @metadata() dekorator. Jadi, properti yang bertentangan dalam @metadata() nilai berlebihan dan akan diganti. Untuk informasi selengkapnya, lihat Tidak ada metadata yang bertentangan.

Langkah berikutnya