|
| 1 | +# Custom |
| 2 | +This directory contains custom implementation for non-generated cmdlets for the `Azs.Compute.Admin` 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 `Azs.Compute.Admin.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 `Azs.Compute.Admin` 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/Azs.Compute.Admin.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 `Azs.Compute.Admin.custom.psm1`. Then, during the build process, this module is loaded and processed in the same manner as the C# cmdlets. The fundemental 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 `Azs.Compute.Admin`. 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.ComputeAdmin.Models.DescriptionAttribute` |
| 35 | + - Used in C# cmdlets to provide a high-level description of the cmdlet. This is propegated to reference documentation via [help comments](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_comment_based_help) in the exported scripts. |
| 36 | +- `Microsoft.Azure.PowerShell.Cmdlets.ComputeAdmin.Models.DoNotExportAttribute` |
| 37 | + - Used in C# and script cmdlets to suppress creating an exported cmdlet at build-time. These cmdlets will *not be exposed* by `Azs.Compute.Admin`. |
| 38 | +- `Microsoft.Azure.PowerShell.Cmdlets.ComputeAdmin.Models.InternalExportAttribute` |
| 39 | + - Used in C# cmdlets to route exported cmdlets to the `..\internal`, which are *not exposed* by `Azs.Compute.Admin`. For more information, see [readme.md](..\internal/readme.md) in the `..\internal` folder. |
| 40 | +- `Microsoft.Azure.PowerShell.Cmdlets.ComputeAdmin.Models.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