|  | 
|  | 1 | +# Custom | 
|  | 2 | +This directory contains custom implementation for non-generated cmdlets for the `Az.Metric` module. Both scripts (`.ps1`) and C# files (`.cs`) can be implemented here. They will be used during the build process in `build-module.ps1`, and create cmdlets into the `..\exports` folder. The only generated file into this folder is the `Az.Metric.custom.psm1`. This file should not be modified. | 
|  | 3 | + | 
|  | 4 | +## Info | 
|  | 5 | +- Modifiable: yes | 
|  | 6 | +- Generated: partial | 
|  | 7 | +- Committed: yes | 
|  | 8 | +- Packaged: yes | 
|  | 9 | + | 
|  | 10 | +## Details | 
|  | 11 | +For `Az.Metric` to use custom cmdlets, it does this two different ways. We **highly recommend** creating script cmdlets, as they are easier to write and allow access to the other exported cmdlets. C# cmdlets *cannot access exported cmdlets*. | 
|  | 12 | + | 
|  | 13 | +For C# cmdlets, they are compiled with the rest of the generated low-level cmdlets into the `./bin/Az.Metric.private.dll`. The names of the cmdlets (methods) and files must follow the `[cmdletName]_[variantName]` syntax used for generated cmdlets. The `variantName` is used as the `ParameterSetName`, so use something appropriate that doesn't clash with already created variant or parameter set names. You cannot use the `ParameterSetName` property in the `Parameter` attribute on C# cmdlets. Each cmdlet must be separated into variants using the same pattern as seen in the `generated/cmdlets` folder. | 
|  | 14 | + | 
|  | 15 | +For script cmdlets, these are loaded via the `Az.Metric.custom.psm1`. Then, during the build process, this module is loaded and processed in the same manner as the C# cmdlets. The fundamental difference is the script cmdlets use the `ParameterSetName` attribute and C# cmdlets do not. To create a script cmdlet variant of a generated cmdlet, simply decorate all parameters in the script with the new `ParameterSetName` in the `Parameter` attribute. This will appropriately treat each parameter set as a separate variant when processed to be exported during the build. | 
|  | 16 | + | 
|  | 17 | +## Purpose | 
|  | 18 | +This allows the modules to have cmdlets that were not defined in the REST specification. It also allows combining logic using generated cmdlets. This is a level of customization beyond what can be done using the [readme configuration options](https://github.com/Azure/autorest/blob/master/docs/powershell/options.md) that are currently available. These custom cmdlets are then referenced by the cmdlets created at build-time in the `..\exports` folder. | 
|  | 19 | + | 
|  | 20 | +## Usage | 
|  | 21 | +The easiest way currently to start developing custom cmdlets is to copy an existing cmdlet. For C# cmdlets, copy one from the `generated/cmdlets` folder. For script cmdlets, build the project using `build-module.ps1` and copy one of the scripts from the `..\exports` folder. After that, if you want to add new parameter sets, follow the guidelines in the `Details` section above. For implementing a new cmdlets, at minimum, please keep these parameters: | 
|  | 22 | +- Break | 
|  | 23 | +- DefaultProfile | 
|  | 24 | +- HttpPipelineAppend | 
|  | 25 | +- HttpPipelinePrepend | 
|  | 26 | +- Proxy | 
|  | 27 | +- ProxyCredential | 
|  | 28 | +- ProxyUseDefaultCredentials | 
|  | 29 | + | 
|  | 30 | +These provide functionality to our HTTP pipeline and other useful features. In script, you can forward these parameters using `$PSBoundParameters` to the other cmdlets you're calling within `Az.Metric`. For C#, follow the usage seen in the `ProcessRecordAsync` method. | 
|  | 31 | + | 
|  | 32 | +### Attributes | 
|  | 33 | +For processing the cmdlets, we've created some additional attributes: | 
|  | 34 | +- `Microsoft.Azure.PowerShell.Cmdlets.Metric.DescriptionAttribute` | 
|  | 35 | +  - Used in C# cmdlets to provide a high-level description of the cmdlet. This is propagated to reference documentation via [help comments](https://learn.microsoft.com/powershell/module/microsoft.powershell.core/about/about_comment_based_help) in the exported scripts. | 
|  | 36 | +- `Microsoft.Azure.PowerShell.Cmdlets.Metric.DoNotExportAttribute` | 
|  | 37 | +  - Used in C# and script cmdlets to suppress creating an exported cmdlet at build-time. These cmdlets will *not be exposed* by `Az.Metric`. | 
|  | 38 | +- `Microsoft.Azure.PowerShell.Cmdlets.Metric.InternalExportAttribute` | 
|  | 39 | +  - Used in C# cmdlets to route exported cmdlets to the `..\internal`, which are *not exposed* by `Az.Metric`. For more information, see [README.md](..\internal/README.md) in the `..\internal` folder. | 
|  | 40 | +- `Microsoft.Azure.PowerShell.Cmdlets.Metric.ProfileAttribute` | 
|  | 41 | +  - Used in C# and script cmdlets to define which Azure profiles the cmdlet supports. This is only supported for Azure (`--azure`) modules. | 
0 commit comments