|
12 | 12 |
|
13 | 13 | namespace Microsoft.Rest.ClientRuntime.PowerShell
|
14 | 14 | {
|
15 |
| - [Cmdlet(VerbsData.Export, "Psd1")] |
16 |
| - [DoNotExport] |
17 |
| - public class ExportPsd1 : PSCmdlet |
18 |
| - { |
19 |
| - [Parameter(Mandatory = true)] |
20 |
| - [ValidateNotNullOrEmpty] |
21 |
| - public string ExportsFolder { get; set; } |
22 |
| - |
23 |
| - [Parameter(Mandatory = true)] |
24 |
| - [ValidateNotNullOrEmpty] |
25 |
| - public string CustomFolder { get; set; } |
26 |
| - |
27 |
| - [Parameter(Mandatory = true)] |
28 |
| - [ValidateNotNullOrEmpty] |
29 |
| - public string Psd1Path { get; set; } |
30 |
| - |
31 |
| - [Parameter(Mandatory = true)] |
32 |
| - public Guid ModuleGuid { get; set; } |
33 |
| - |
34 |
| - private static readonly bool IsAzure = Convert.ToBoolean(@"${$project.azure}"); |
35 |
| - private const string CustomFolderRelative = "${$project.customFolder}"; |
36 |
| - private const string Indent = Psd1Indent; |
37 |
| - |
38 |
| - protected override void ProcessRecord() |
| 15 | + [Cmdlet(VerbsData.Export, "Psd1")] |
| 16 | + [DoNotExport] |
| 17 | + public class ExportPsd1 : PSCmdlet |
39 | 18 | {
|
40 |
| - try |
41 |
| - { |
42 |
| - if (!Directory.Exists(ExportsFolder)) |
43 |
| - { |
44 |
| - throw new ArgumentException($"Exports folder '{ExportsFolder}' does not exist"); |
45 |
| - } |
| 19 | + [Parameter(Mandatory = true)] |
| 20 | + [ValidateNotNullOrEmpty] |
| 21 | + public string ExportsFolder { get; set; } |
46 | 22 |
|
47 |
| - if (!Directory.Exists(CustomFolder)) |
48 |
| - { |
49 |
| - throw new ArgumentException($"Custom folder '{CustomFolder}' does not exist"); |
50 |
| - } |
| 23 | + [Parameter(Mandatory = true)] |
| 24 | + [ValidateNotNullOrEmpty] |
| 25 | + public string CustomFolder { get; set; } |
51 | 26 |
|
52 |
| - string version = Convert.ToString(@"${$project.moduleVersion}"); |
53 |
| - // Validate the module version should be semantic version |
54 |
| - // Following regex is official from https://semver.org/ |
55 |
| - Regex rx = new Regex(@"^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$", RegexOptions.Compiled); |
56 |
| - if (rx.Matches(version).Count != 1) |
57 |
| - { |
58 |
| - throw new ArgumentException("Module-version is not a valid Semantic Version"); |
59 |
| - } |
| 27 | + [Parameter(Mandatory = true)] |
| 28 | + [ValidateNotNullOrEmpty] |
| 29 | + public string Psd1Path { get; set; } |
60 | 30 |
|
61 |
| - string previewVersion = null; |
62 |
| - if (version.Contains('-')) |
63 |
| - { |
64 |
| - string[] versions = version.Split("-".ToCharArray(), 2); |
65 |
| - version = versions[0]; |
66 |
| - previewVersion = versions[1]; |
67 |
| - } |
| 31 | + [Parameter(Mandatory = true)] |
| 32 | + public Guid ModuleGuid { get; set; } |
68 | 33 |
|
69 |
| - var sb = new StringBuilder(); |
70 |
| - sb.AppendLine("@{"); |
71 |
| - sb.AppendLine($@"{GuidStart} = '{ModuleGuid}'"); |
72 |
| - sb.AppendLine($@"{Indent}RootModule = '{"${$project.psm1}"}'"); |
73 |
| - sb.AppendLine($@"{Indent}ModuleVersion = '{version}'"); |
74 |
| - sb.AppendLine($@"{Indent}CompatiblePSEditions = 'Core', 'Desktop'"); |
75 |
| - sb.AppendLine($@"{Indent}Author = '{"${$project.metadata.authors}"}'"); |
76 |
| - sb.AppendLine($@"{Indent}CompanyName = '{"${$project.metadata.companyName}"}'"); |
77 |
| - sb.AppendLine($@"{Indent}Copyright = '{"${$project.metadata.copyright}"}'"); |
78 |
| - sb.AppendLine($@"{Indent}Description = '{"${$project.metadata.description}"}'"); |
79 |
| - sb.AppendLine($@"{Indent}PowerShellVersion = '5.1'"); |
80 |
| - sb.AppendLine($@"{Indent}DotNetFrameworkVersion = '4.7.2'"); |
81 |
| - sb.AppendLine($@"{Indent}RequiredAssemblies = '{"${$project.dll}"}'"); |
82 |
| - |
83 |
| - var customFormatPs1xmlFiles = Directory.GetFiles(CustomFolder) |
84 |
| - .Where(f => f.EndsWith(".format.ps1xml")) |
85 |
| - .Select(f => $"{CustomFolderRelative}/{Path.GetFileName(f)}"); |
86 |
| - var formatList = customFormatPs1xmlFiles.Prepend("${$project.formatPs1xml}").ToPsList(); |
87 |
| - sb.AppendLine($@"{Indent}FormatsToProcess = {formatList}"); |
88 |
| - |
89 |
| - var functionInfos = GetScriptCmdlets(ExportsFolder).ToArray(); |
90 |
| - var cmdletsList = functionInfos.Select(fi => fi.Name).Distinct().Append("*").ToPsList(); |
91 |
| - sb.AppendLine($@"{Indent}FunctionsToExport = {cmdletsList}"); |
92 |
| - var aliasesList = functionInfos.SelectMany(fi => fi.ScriptBlock.Attributes).ToAliasNames().Append("*").ToPsList(); |
93 |
| - sb.AppendLine($@"{Indent}AliasesToExport = {aliasesList}"); |
94 |
| - |
95 |
| - sb.AppendLine($@"{Indent}PrivateData = @{{"); |
96 |
| - sb.AppendLine($@"{Indent}{Indent}PSData = @{{"); |
97 |
| - |
98 |
| - if (previewVersion != null) |
99 |
| - { |
100 |
| - sb.AppendLine($@"{Indent}{Indent}{Indent}Prerelease = {previewVersion}"); |
101 |
| - } |
102 |
| - sb.AppendLine($@"{Indent}{Indent}{Indent}Tags = {"${$project.metadata.tags}".Split(' ').ToPsList().NullIfEmpty() ?? "''"}"); |
103 |
| - sb.AppendLine($@"{Indent}{Indent}{Indent}LicenseUri = '{"${$project.metadata.licenseUri}"}'"); |
104 |
| - sb.AppendLine($@"{Indent}{Indent}{Indent}ProjectUri = '{"${$project.metadata.projectUri}"}'"); |
105 |
| - sb.AppendLine($@"{Indent}{Indent}{Indent}ReleaseNotes = ''"); |
106 |
| - var profilesList = "${$project.profiles.map(each => `'` + each + `'`).join(', ')}"; |
107 |
| - if (IsAzure && !String.IsNullOrEmpty(profilesList)) |
| 34 | + private static readonly bool IsAzure = Convert.ToBoolean(@"${$project.azure}"); |
| 35 | + private const string CustomFolderRelative = "${$project.customFolder}"; |
| 36 | + private const string Indent = Psd1Indent; |
| 37 | + private const string Undefined = "undefined"; |
| 38 | + private bool IsUndefined(string value) => string.Equals(Undefined, value, StringComparison.OrdinalIgnoreCase); |
| 39 | + |
| 40 | + protected override void ProcessRecord() |
108 | 41 | {
|
109 |
| - sb.AppendLine($@"{Indent}{Indent}{Indent}Profiles = {profilesList}"); |
| 42 | + try |
| 43 | + { |
| 44 | + if (!Directory.Exists(ExportsFolder)) |
| 45 | + { |
| 46 | + throw new ArgumentException($"Exports folder '{ExportsFolder}' does not exist"); |
| 47 | + } |
| 48 | + |
| 49 | + if (!Directory.Exists(CustomFolder)) |
| 50 | + { |
| 51 | + throw new ArgumentException($"Custom folder '{CustomFolder}' does not exist"); |
| 52 | + } |
| 53 | + |
| 54 | + string version = Convert.ToString(@"${$project.moduleVersion}"); |
| 55 | + // Validate the module version should be semantic version |
| 56 | + // Following regex is official from https://semver.org/ |
| 57 | + Regex rx = new Regex(@"^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$", RegexOptions.Compiled); |
| 58 | + if (rx.Matches(version).Count != 1) |
| 59 | + { |
| 60 | + throw new ArgumentException("Module-version is not a valid Semantic Version"); |
| 61 | + } |
| 62 | + |
| 63 | + string previewVersion = null; |
| 64 | + if (version.Contains('-')) |
| 65 | + { |
| 66 | + string[] versions = version.Split("-".ToCharArray(), 2); |
| 67 | + version = versions[0]; |
| 68 | + previewVersion = versions[1]; |
| 69 | + } |
| 70 | + |
| 71 | + var sb = new StringBuilder(); |
| 72 | + sb.AppendLine("@{"); |
| 73 | + sb.AppendLine($@"{GuidStart} = '{ModuleGuid}'"); |
| 74 | + sb.AppendLine($@"{Indent}RootModule = '{"${$project.psm1}"}'"); |
| 75 | + sb.AppendLine($@"{Indent}ModuleVersion = '{version}'"); |
| 76 | + sb.AppendLine($@"{Indent}CompatiblePSEditions = 'Core', 'Desktop'"); |
| 77 | + sb.AppendLine($@"{Indent}Author = '{"${$project.metadata.authors}"}'"); |
| 78 | + sb.AppendLine($@"{Indent}CompanyName = '{"${$project.metadata.companyName}"}'"); |
| 79 | + sb.AppendLine($@"{Indent}Copyright = '{"${$project.metadata.copyright}"}'"); |
| 80 | + sb.AppendLine($@"{Indent}Description = '{"${$project.metadata.description}"}'"); |
| 81 | + sb.AppendLine($@"{Indent}PowerShellVersion = '5.1'"); |
| 82 | + sb.AppendLine($@"{Indent}DotNetFrameworkVersion = '4.7.2'"); |
| 83 | + |
| 84 | + // RequiredModules |
| 85 | + if (!IsUndefined("${$project.metadata.requiredModulesAsString}")) |
| 86 | + { |
| 87 | + sb.AppendLine($@"{Indent}RequiredModules = @({"${$project.metadata.requiredModulesAsString}"})"); |
| 88 | + } |
| 89 | + |
| 90 | + // RequiredAssemblies |
| 91 | + if (!IsUndefined("${$project.metadata.requiredAssembliesAsString}")) |
| 92 | + { |
| 93 | + sb.AppendLine($@"{Indent}RequiredAssemblies = @({"${$project.metadata.requiredAssembliesAsString}"})"); |
| 94 | + } |
| 95 | + else |
| 96 | + { |
| 97 | + sb.AppendLine($@"{Indent}RequiredAssemblies = '{"${$project.dll}"}'"); |
| 98 | + } |
| 99 | + |
| 100 | + // NestedModules |
| 101 | + if (!IsUndefined("${$project.metadata.nestedModulesAsString}")) |
| 102 | + { |
| 103 | + sb.AppendLine($@"{Indent}NestedModules = @({"${$project.metadata.nestedModulesAsString}"})"); |
| 104 | + } |
| 105 | + |
| 106 | + // FormatsToProcess |
| 107 | + if (!IsUndefined("${$project.metadata.formatsToProcessAsString}")) |
| 108 | + { |
| 109 | + sb.AppendLine($@"{Indent}FormatsToProcess = @({"${$project.metadata.formatsToProcessAsString}"})"); |
| 110 | + } |
| 111 | + else |
| 112 | + { |
| 113 | + var customFormatPs1xmlFiles = Directory.GetFiles(CustomFolder) |
| 114 | + .Where(f => f.EndsWith(".format.ps1xml")) |
| 115 | + .Select(f => $"{CustomFolderRelative}/{Path.GetFileName(f)}"); |
| 116 | + var formatList = customFormatPs1xmlFiles.Prepend("${$project.formatPs1xml}").ToPsList(); |
| 117 | + sb.AppendLine($@"{Indent}FormatsToProcess = {formatList}"); |
| 118 | + } |
| 119 | + |
| 120 | + // TypesToProcess |
| 121 | + if (!IsUndefined("${$project.metadata.typesToProcessAsString}")) |
| 122 | + { |
| 123 | + sb.AppendLine($@"{Indent}TypesToProcess = @({"${$project.metadata.typesToProcessAsString}"})"); |
| 124 | + } |
| 125 | + |
| 126 | + // ScriptsToProcess |
| 127 | + if (!IsUndefined("${$project.metadata.scriptsToProcessAsString}")) |
| 128 | + { |
| 129 | + sb.AppendLine($@"{Indent}ScriptsToProcess = @({"${$project.metadata.scriptsToProcessAsString}"})"); |
| 130 | + } |
| 131 | + |
| 132 | + var functionInfos = GetScriptCmdlets(ExportsFolder).ToArray(); |
| 133 | + // FunctionsToExport |
| 134 | + if (!IsUndefined("${$project.metadata.functionsToExportAsString}")) |
| 135 | + { |
| 136 | + sb.AppendLine($@"{Indent}FunctionsToExport = @({"${$project.metadata.functionsToExportAsString}"})"); |
| 137 | + } |
| 138 | + else |
| 139 | + { |
| 140 | + var cmdletsList = functionInfos.Select(fi => fi.Name).Distinct().Append("*").ToPsList(); |
| 141 | + sb.AppendLine($@"{Indent}FunctionsToExport = {cmdletsList}"); |
| 142 | + } |
| 143 | + |
| 144 | + // AliasesToExport |
| 145 | + if (!IsUndefined("${$project.metadata.aliasesToExportAsString}")) |
| 146 | + { |
| 147 | + sb.AppendLine($@"{Indent}AliasesToExport = @({"${$project.metadata.aliasesToExportAsString}"})"); |
| 148 | + } |
| 149 | + else |
| 150 | + { |
| 151 | + var aliasesList = functionInfos.SelectMany(fi => fi.ScriptBlock.Attributes).ToAliasNames().Append("*").ToPsList(); |
| 152 | + sb.AppendLine($@"{Indent}AliasesToExport = {aliasesList}"); |
| 153 | + } |
| 154 | + |
| 155 | + // CmdletsToExport |
| 156 | + if (!IsUndefined("${$project.metadata.cmdletsToExportAsString}")) |
| 157 | + { |
| 158 | + sb.AppendLine($@"{Indent}CmdletsToExport = @({"${$project.metadata.cmdletsToExportAsString}"})"); |
| 159 | + } |
| 160 | + |
| 161 | + sb.AppendLine($@"{Indent}PrivateData = @{{"); |
| 162 | + sb.AppendLine($@"{Indent}{Indent}PSData = @{{"); |
| 163 | + |
| 164 | + if (previewVersion != null) |
| 165 | + { |
| 166 | + sb.AppendLine($@"{Indent}{Indent}{Indent}Prerelease = {previewVersion}"); |
| 167 | + } |
| 168 | + sb.AppendLine($@"{Indent}{Indent}{Indent}Tags = {"${$project.metadata.tags}".Split(' ').ToPsList().NullIfEmpty() ?? "''"}"); |
| 169 | + sb.AppendLine($@"{Indent}{Indent}{Indent}LicenseUri = '{"${$project.metadata.licenseUri}"}'"); |
| 170 | + sb.AppendLine($@"{Indent}{Indent}{Indent}ProjectUri = '{"${$project.metadata.projectUri}"}'"); |
| 171 | + sb.AppendLine($@"{Indent}{Indent}{Indent}ReleaseNotes = ''"); |
| 172 | + var profilesList = "${$project.profiles.map(each => `'` + each + `'`).join(', ')}"; |
| 173 | + if (IsAzure && !String.IsNullOrEmpty(profilesList)) |
| 174 | + { |
| 175 | + sb.AppendLine($@"{Indent}{Indent}{Indent}Profiles = {profilesList}"); |
| 176 | + } |
| 177 | + |
| 178 | + sb.AppendLine($@"{Indent}{Indent}}}"); |
| 179 | + sb.AppendLine($@"{Indent}}}"); |
| 180 | + sb.AppendLine(@"}"); |
| 181 | + |
| 182 | + File.WriteAllText(Psd1Path, sb.ToString()); |
| 183 | + } |
| 184 | + catch (Exception ee) |
| 185 | + { |
| 186 | + Console.WriteLine($"${ee.GetType().Name}/{ee.StackTrace}"); |
| 187 | + throw ee; |
| 188 | + } |
110 | 189 | }
|
111 |
| - |
112 |
| - sb.AppendLine($@"{Indent}{Indent}}}"); |
113 |
| - sb.AppendLine($@"{Indent}}}"); |
114 |
| - sb.AppendLine(@"}"); |
115 |
| - |
116 |
| - File.WriteAllText(Psd1Path, sb.ToString()); |
117 |
| - } |
118 |
| - catch (Exception ee) |
119 |
| - { |
120 |
| - Console.WriteLine($"${ee.GetType().Name}/{ee.StackTrace}"); |
121 |
| - throw ee; |
122 |
| - } |
123 | 190 | }
|
124 |
| - } |
125 | 191 | }
|
0 commit comments