Last active
July 5, 2024 23:14
-
-
Save jdhitsolutions/d34b2974817f043f4a468549a18939c1 to your computer and use it in GitHub Desktop.
Presentation material for PSUGInnSalzach 9 Nov 2023
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
return "This is a demo script file." | |
#demo.ps1 | |
#about me | |
https://jdhitsolutions.github.io | |
#Module layout | |
psedit c:\scripts\new-project.ps1 | |
. c:\scripts\new-project.ps1 | |
Help New-PSProject | |
#create new project in demo folder | |
New-PSProject -Name PSDemo -Path . -CommandNames "Get-Foo","Set-Foo" -Description "demo module" -NoGitHub | |
dir -Recurse | |
psedit .\PSDemo.psm1 | |
psedit .\PSDemo.psd1 | |
git status | |
# Install-Module PSFunctionTools | |
# https://github.com/jdhitsolutions/PSFunctionTools | |
Get-PSFunctionTools | |
#creating the layout | |
help Import-ModuleLayout -Examples | |
Help New-ModuleFromFiles -examples | |
help New-ModuleFromLayout -Examples | |
psedit C:\scripts\PSFunctionTools\samples\ModuleLayout.json | |
https://github.com/jdhitsolutions/PSFunctionTools/blob/main/samples/ModuleLayout.json | |
#adding commands | |
Export-FunctionFromFile -Path C:\scripts\JDH-Functions.ps1 -OutputPath .\functions\ -WhatIf | |
#alternatives | |
# Plaster and Stucco are popular PowerShell modules | |
#project status | |
# Install-Module PSProjectStatus | |
# https://github.com/jdhitsolutions/PSProjectStatus | |
help New-PSProjectStatus | |
New-PSProjectStatus -version 0.1.0 | |
psedit .\psproject.json | |
git checkout -b 0.2.0 | |
Set-PSProjectStatus -LastUpdate (Get-Date) -ProjectVersion 0.2.0 -tasks "help documentation","pester tests","update readme" | |
Get-PSProjectStatus | |
Get-PSProjectGitStatus | |
#look at updated JSON file | |
#adding help | |
# Install-Module platyps | |
# setup script copies my default tasks.json file | |
(Get-Content .\.vscode\tasks.json | ConvertFrom-Json).Tasks | |
#add help | |
#update help | |
#external help | |
#change log | |
# Install-Module ChangelogManagement | |
# https://github.com/natescherer/ChangelogManagement | |
Get-Command -module ChangeLogManagement | |
New-Changelog | |
psedit .\Changelog.md | |
help Add-ChangelogData | |
Add-ChangelogData -Type Added -Data "Added help documentation." | |
#a sample | |
psedit C:\scripts\PSWorkItem\changelog.md | |
# https://github.com/jdhitsolutions/PSWorkItem/blob/main/changelog.md | |
#publishing | |
psedit C:\scripts\Publish-Project.ps1 | |
#deploy to github | |
psedit c:\scripts\gitreleasepush.ps1 | |
#keep track of tasks | |
# Install-Module PSWorkItem | |
# https://github.com/jdhitsolutions/PSWorkItem | |
Get-PSWorkItem | |
New-PSWorkItem -Name "PSDemo update" -DaysDue 3 -Category Project -WhatIf | |
#run in a PS7 window | |
Open-PSWorkItemConsole -Path C:\work\PSWorkItem.db | |
#My favorite projects | |
# https://github.com/jdhitsolutions?tab=repositories | |
#PSScriptTools | |
# https://github.com/jdhitsolutions/PSScriptTools | |
#PSTypeExtensionTools | |
# https://github.com/jdhitsolutions/PSTypeExtensionTools | |
#PSReleaseTools | |
# https://github.com/jdhitsolutions/PSReleaseTools |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
MIT License | |
Copyright (c) 2023 JDH Information Technology Solutions, Inc. | |
Permission is hereby granted, free of charge, to any person obtaining a copy | |
of this software and associated documentation files (the "Software"), to deal | |
in the Software without restriction, including without limitation the rights | |
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
copies of the Software, and to permit persons to whom the Software is | |
furnished to do so, subject to the following conditions: | |
The above copyright notice and this permission notice shall be included in | |
all copies or substantial portions of the Software. | |
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
THE SOFTWARE. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#requires -version 5.1 | |
#requires -module Pester | |
#requires -module Platyps | |
<# | |
TODO: | |
split this up into different commands and create a module | |
validate pester test stub | |
Add parameters to specify PSEdition | |
#> | |
#use the gh.exe cli tool | |
# . C:\scripts\New-GitHubRepo.ps1 | |
Function New-PSProject { | |
<# PSFunctionInfo | |
Version 2.0.0 | |
Author Jeff Hicks | |
CompanyName JDH Information Technology Solutions, Inc. | |
Copyright 2021-2023 | |
Description Create a PowerShell module project | |
Guid 8b92e54d-4e02-48a3-b811-62e27bda6d3a | |
Tags module | |
LastUpdate 7/14/2023 1:11 PM | |
Source C:\Scripts\New-Project.ps1 | |
#> | |
<# | |
.SYNOPSIS | |
Create a PowerShell project folder. | |
.DESCRIPTION | |
Use this command to create a new PowerShell project folder. You specify a top level folder and the name of a project. The command will create a Tests sub-folder, a Pester script outline and set the project up in Git. The command will also create a Docs folder and a culture-specific folder for localized help. | |
The Git commands will initialize the folder, create a README.md file, a LICENSE.txt file, create a 0.0.1 branch and checkout that branch. The command assumes you have the Git command in your path. | |
.EXAMPLE | |
.NOTES | |
Learn more about PowerShell: | |
http://jdhitsolutions.com/blog/essential-powershell-resources/ | |
.LINK | |
git | |
.LINK | |
New-Item | |
.INPUTS | |
[string] | |
.OUTPUTS | |
None | |
#> | |
[cmdletbinding(SupportsShouldProcess)] | |
Param( | |
[Parameter( | |
Position = 0, | |
Mandatory, | |
HelpMessage = "The name of the project" | |
)] | |
[ValidateNotNullOrEmpty()] | |
#Specify the project name. This will become the directory name as well and the name of the GitHub repository. | |
[string]$Name, | |
[Parameter(HelpMessage = "The top level path for the new project")] | |
[ValidateNotNullOrEmpty()] | |
[ValidateScript( { | |
if (Test-Path $_) { | |
$True | |
} | |
else { | |
Throw "Cannot validate path $_" | |
} | |
})] | |
#Specify the top level path for the new project | |
[string]$Path = "C:\Scripts", | |
#names of commands you intend to start with. These will be exported by default. | |
[string[]]$CommandNames, | |
[Parameter(HelpMessage = "Specify the user or company for the MIT license")] | |
[ValidateNotNullOrEmpty()] | |
#Specify the user or company for the MIT license | |
[string]$License = "JDH Information Technology Solutions, Inc.", | |
[Parameter(Mandatory,HelpMessage ="Specify a project description" )] | |
[string]$Description, | |
[switch]$Passthru, | |
[parameter(HelpMessage = "Do not create a Github repository")] | |
[switch]$NoGitHub | |
) | |
Write-Verbose "[BEGIN ] Starting: $($MyInvocation.MyCommand)" | |
Write-Verbose "[PROCESS] Creating project $name under $path" | |
$newPath = Join-Path -Path $Path -ChildPath $Name | |
If (-Not (Test-Path -Path $newPath) ) { | |
[void](New-Item -Path $path -Name $Name -ItemType Directory) | |
#create localized folder | |
Write-Verbose "[PROCESS] Creating folder $PSCulture under $path" | |
[void](New-Item -path $newPath -Name $PSCulture -ItemType Directory) | |
#create functions folder | |
Write-Verbose "[PROCESS] Creating folder functions under $path" | |
[void](New-Item -path $newPath -Name functions -ItemType Directory) | |
#create formats folder | |
Write-Verbose "[PROCESS] Creating folder formats under $path" | |
[void](New-Item -path $newPath -Name formats -ItemType Directory) | |
#create images folder | |
Write-Verbose "[PROCESS] Creating folder images under $path" | |
[void](New-Item -path $newPath -Name images -ItemType Directory) | |
#create docs folder | |
Write-Verbose "[PROCESS] Creating folder docs under $path" | |
$docs = New-Item -path $newPath -Name docs -ItemType Directory | |
#create .vscode folder | |
Write-Verbose "[PROCESS] Creating folder .vscode under $path" | |
$code = New-Item -path $newPath -Name .vscode -ItemType Directory | |
Copy-Item -path c:\scripts\tasks.json -Destination $code | |
#create module file | |
Write-Verbose "[PROCESS] Creating $name.psm1" | |
if ($CommandNames) { | |
$cmd = @() | |
foreach ($item in $CommandNames) { | |
Write-Verbose "[PROCESS] creating function scaffold for $item" | |
$f = @" | |
Function $item { | |
[cmdletbinding()] | |
Param( | |
) | |
Begin { | |
Write-Verbose "[BEGIN ] Starting: `$(`$MyInvocation.MyCommand)" | |
} #begin | |
Process { | |
Write-Verbose "[PROCESS] Processing" | |
} #process | |
End { | |
Write-Verbose "[END ] Ending: `$(`$MyInvocation.MyCommand)" | |
} #end | |
} #close $item | |
"@ | |
#create the file | |
$file = Join-Path -path $newPath -ChildPath "functions\$item.ps1" | |
Set-Content -Value $f -Path $file | |
} #foreach item | |
} #if command names | |
$myScript = @" | |
#region Main | |
Get-ChildItem -path `$PSScriptRoot\functions\*.ps1 | | |
ForEach-Object { . `$_.FullName} | |
#endregion | |
"@ | |
Set-Content -Value $myScript -Path "$newPath\$name.psm1" | |
#create manifest | |
Write-Verbose "[PROCESS] Creating $name.psd1" | |
$manHash = @{ | |
Path = "$newPath\$name.psd1" | |
RootModule = "$name.psm1" | |
Description = $Description | |
CompanyName = $License | |
Copyright = "$((Get-Date).year) $Lic | |
ense" | |
} | |
$cmdString = $CommandNames -join ',' | |
If ($CommandNames) { | |
$manHash.Add("FunctionsToExport", $cmdString) | |
} | |
New-ModuleManifest @manHash | |
Write-Verbose "[PROCESS] Creating About help topic outline" | |
if ($pscmdlet.ShouldProcess($docs.FullName, "New Markdown About Help")) { | |
New-MarkdownAboutHelp -OutputFolder $docs.FullName -AboutName $Name | |
} | |
#create Changelog.txt | |
Write-Verbose "[PROCESS] Creating Changelog.md" | |
Set-Content -Path $newPath\Changelog.md -Value "# Changelog for $Name" | |
#create README.md | |
Write-Verbose "[PROCESS] Creating README.md" | |
$readme = @" | |
# $Name | |
{INSERT CONTENT} | |
Last Updated _$(Get-Date -format u)_ | |
"@ | |
Set-Content -Value $readme -Path "$newPath\README.md" | |
#create License file | |
$lic = @" | |
Copyright (c) $((Get-Date).Year) $License | |
Permission is hereby granted, free of charge, to any person obtaining a copy | |
of this software and associated documentation files (the "Software"), to deal | |
in the Software without restriction, including without limitation the rights | |
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
copies of the Software, and to permit persons to whom the Software is | |
furnished to do so, subject to the following conditions: | |
The above copyright notice and this permission notice shall be included in | |
all copies or substantial portions of the Software. | |
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
THE SOFTWARE. | |
"@ | |
Write-Verbose "[PROCESS] Creating LICENSE.txt" | |
Set-Content -Value $lic -Path "$newPath\LICENSE.txt" | |
#create scratch files which my git config is set to ignore | |
Write-Verbose "[PROCESS] Creating scratch.ps1" | |
Set-Content -Value "#scratch file for $Name" -Path "$newPath\scratch.ps1" | |
Write-Verbose "[PROCESS] Creating scratch-change.md" | |
Set-Content -Value "# $Name" -Path "$newPath\scratch-change.md" | |
#create Test Folder | |
Write-Verbose "[PROCESS] Creating Tests folder" | |
$tests = New-Item -Path $newPath -Name tests -ItemType Directory | |
#Pester Init | |
Write-Verbose "[PROCESS] Running Pester setup" | |
#body of Test script | |
$TestInit = @" | |
BeforeAll { | |
. $PSCommandPath.Replace('.Tests.ps1', '.ps1') | |
} | |
`$here = Split-Path -Path `$MyInvocation.MyCommand.Path | |
`$parent = Split-Path -Path `$here | |
`$module = Split-Path -Path `$parent -Leaf | |
Write-Host "Importing module `$module from `$parent" -ForegroundColor Cyan | |
Import-Module `$parent -force | |
InModuleScope `$Module { | |
Describe $Name { | |
It "does something useful" { | |
`$true | Should Be `$true | |
} | |
} | |
} | |
"@ | |
if ($PSCmdlet.ShouldProcess("newPath", "Pester setup")) { | |
$PesterTest = Join-Path -Path $Tests.FullName -ChildPath "$name.tests.ps1" | |
Write-Verbose "[PROCESS] Creating $pestertest" | |
Set-Content -Value $TestInit -Path $PesterTest | |
Write-Verbose "[PROCESS] Git commit $pestertest" | |
} | |
#Git Init | |
Write-Verbose "[PROCESS] Running Git setup" | |
if ($PSCmdlet.ShouldProcess($newPath, "Git Init")) { | |
Write-Verbose "[PROCESS] Git: Init" | |
git init -q $newpath | |
Set-Location $newPath | |
#create Main and add all files | |
Write-Verbose "[PROCESS] Git: Add base Files" | |
git add . | |
Write-Verbose "[PROCESS] Git: Initial Commit" | |
git commit -a -q -m "Initial commit" | |
# $r = New-GitHubRepository -Name $name -NoWiki -Private -Raw -Description $Description | |
#give repo a chance to finish setting up online | |
#Start-Sleep -Seconds 5 | |
#Write-Verbose "[PROCESS] Git: git remote add origin $($r.clone_url)" | |
#git remote add origin "$($r.clone_url)" | |
#Start-Sleep -Seconds 5 | |
#create the Github remote using the GitHub CLI | |
if (-Not $NoGitHub) { | |
Try { | |
[void](Get-Command gh.exe -ErrorAction stop) | |
Write-Verbose "[PROCESS] Creating a new private GitHub repository $Name" | |
gh repo create $name --private --disable-wiki --description $Description | |
Write-Verbose "[PROCESS] Git: git push --set-upstream origin main" | |
git push --set-upstream origin main | |
#create initial branch | |
Write-Verbose "[PROCESS] Git: Create 0.0.1 branch" | |
git branch -q 0.0.1 | |
#checkout initial | |
Write-Verbose "[PROCESS] Git: Checkout 0.0.1 branch" | |
git checkout -q 0.0.1 | |
} | |
Catch { | |
Write-Warning "Can't find gh.exe. You will need to manually finish setting up the Github repo." | |
} | |
} #setup Github repo | |
} | |
else { | |
#simulate WhatIf processing for Git commands | |
Write-Host "What if: performing the operation git init -q $newPath" | |
Write-Host "What if: performing the operation git commit -a -q -m 'Initial commit'" | |
if (-not $NoGitHub) { | |
Write-Host "What if: Creating a new private GitHub repository $Name" | |
Write-Host "What if: performing the operation gh repo create $name --private --enable-wiki=false --description $Description --confirm" | |
Write-Host "What if: performing the operation git push --set-upstream origin main" | |
Write-Host "What if: performing the operation git branch -q 0.0.1" | |
Write-Host "What if: performing the operation git checkout -q 0.0.1" | |
} | |
} | |
} | |
else { | |
Write-Warning "$NewPath appears to already exist." | |
} | |
if (Test-Path -path $newPath) { | |
Set-Location $newPath | |
} | |
if ($Passthru) { | |
Get-ChildItem -Recurse | |
} | |
Write-Verbose "[END ] Ending: $($MyInvocation.Mycommand)" | |
} #close function |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#This script requires the Github CLI client (gh.exe) | |
[cmdletbinding(SupportsShouldProcess)] | |
Param([switch]$Preview) | |
#make sure nothing is un-stage or committed | |
Write-Host "Processing project in $PWD" -ForegroundColor Green | |
$st = git status --porcelain | |
if ($st) { | |
Write-Warning "There are uncommitted or un-staged items" | |
Write-Host ($st | Out-String) -ForegroundColor Yellow | |
return | |
} | |
#get current branch | |
$br = git branch --show-current | |
Write-Host "On branch $br" -ForegroundColor Green | |
if ($br -match "^(\d+\.)+") { | |
#Strip off a leading v if included | |
if ($br -match "^v") { | |
$br = $br.Replace("v", "") | |
} | |
$tag = "v$br" | |
<# | |
Need to accommodate that some repos use main instead of master | |
#> | |
if ((git branch -l master) -AND $PSCmdlet.ShouldProcess("master", "Git checkout")) { | |
git checkout master | |
} | |
elseif ((git branch -l main) -AND $PSCmdlet.ShouldProcess("main", "Git checkout")) { | |
git checkout main | |
} | |
elseif (-Not ($WhatIfPreference)) { | |
Write-Warning "Can't determine master or main branch" | |
#bail out | |
Return | |
} | |
if ($PSCmdlet.ShouldProcess($br, "Git merge")) { | |
git merge $br | |
} | |
if ($PSCmdlet.ShouldProcess("master/main", "Git push")) { | |
git push | |
} | |
if ($PSCmdlet.ShouldProcess($tag, "Git tag")) { | |
git tag $tag | |
} | |
if ($PSCmdlet.ShouldProcess("--tag", "Git push")) { | |
git push --tag | |
$origin = (git remote get-url --push origin) -replace "\.git$", "" | |
#create release | |
#gh release create TAG-F D:\r.md -p -t TITLE | |
if (Test-Path "$pwd\scratch-change.md") { | |
$title = "{0}_{1}" -f (Split-Path $pwd -leaf),$tag | |
Write-Host "Creating release $title from $pwd\scratch-change.md" -fore yellow | |
if ($Preview) { | |
write-Host "PREVIEW" -ForegroundColor Cyan | |
gh release create $tag -F "$pwd\scratch-change.md" -p -t $title | |
} | |
else { | |
gh release create $tag -F "$pwd\scratch-change.md" -t $title | |
} | |
} | |
else { | |
#configure release online | |
Write-Host "Creating release online" -ForegroundColor green | |
Write-Host "Open and edit the release on GitHub" -ForegroundColor Green | |
Write-Host "$origin/releases/tag/$tag" -ForegroundColor green | |
Start-Process "$origin/releases/tag/$tag" | |
} | |
} | |
} | |
else { | |
Write-Warning "The branch $br does not appear to be a version number" | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#requires -version 5.1 | |
#requires -module Pester | |
#requires -module Platyps | |
<# | |
TODO: | |
split this up into different commands and create a module | |
validate pester test stub | |
Add parameters to specify PSEdition | |
#> | |
#use the gh.exe cli tool | |
# . C:\scripts\New-GitHubRepo.ps1 | |
Function New-PSProject { | |
<# PSFunctionInfo | |
Version 2.0.0 | |
Author Jeff Hicks | |
CompanyName JDH Information Technology Solutions, Inc. | |
Copyright 2021-2023 | |
Description Create a PowerShell module project | |
Guid 8b92e54d-4e02-48a3-b811-62e27bda6d3a | |
Tags module | |
LastUpdate 7/14/2023 1:11 PM | |
Source C:\Scripts\New-Project.ps1 | |
#> | |
<# | |
.SYNOPSIS | |
Create a PowerShell project folder. | |
.DESCRIPTION | |
Use this command to create a new PowerShell project folder. You specify a top level folder and the name of a project. The command will create a Tests sub-folder, a Pester script outline and set the project up in Git. The command will also create a Docs folder and a culture-specific folder for localized help. | |
The Git commands will initialize the folder, create a README.md file, a LICENSE.txt file, create a 0.0.1 branch and checkout that branch. The command assumes you have the Git command in your path. | |
.EXAMPLE | |
.NOTES | |
Learn more about PowerShell: | |
http://jdhitsolutions.com/blog/essential-powershell-resources/ | |
.LINK | |
git | |
.LINK | |
New-Item | |
.INPUTS | |
[string] | |
.OUTPUTS | |
None | |
#> | |
[cmdletbinding(SupportsShouldProcess)] | |
Param( | |
[Parameter( | |
Position = 0, | |
Mandatory, | |
HelpMessage = "The name of the project" | |
)] | |
[ValidateNotNullOrEmpty()] | |
#Specify the project name. This will become the directory name as well and the name of the GitHub repository. | |
[string]$Name, | |
[Parameter(HelpMessage = "The top level path for the new project")] | |
[ValidateNotNullOrEmpty()] | |
[ValidateScript( { | |
if (Test-Path $_) { | |
$True | |
} | |
else { | |
Throw "Cannot validate path $_" | |
} | |
})] | |
#Specify the top level path for the new project | |
[string]$Path = "C:\Scripts", | |
#names of commands you intend to start with. These will be exported by default. | |
[string[]]$CommandNames, | |
[Parameter(HelpMessage = "Specify the user or company for the MIT license")] | |
[ValidateNotNullOrEmpty()] | |
#Specify the user or company for the MIT license | |
[string]$License = "JDH Information Technology Solutions, Inc.", | |
[Parameter(Mandatory,HelpMessage ="Specify a project description" )] | |
[string]$Description, | |
[switch]$Passthru, | |
[parameter(HelpMessage = "Do not create a Github repository")] | |
[switch]$NoGitHub | |
) | |
Write-Verbose "[BEGIN ] Starting: $($MyInvocation.MyCommand)" | |
Write-Verbose "[PROCESS] Creating project $name under $path" | |
$newPath = Join-Path -Path $Path -ChildPath $Name | |
If (-Not (Test-Path -Path $newPath) ) { | |
[void](New-Item -Path $path -Name $Name -ItemType Directory) | |
#create localized folder | |
Write-Verbose "[PROCESS] Creating folder $PSCulture under $path" | |
[void](New-Item -path $newPath -Name $PSCulture -ItemType Directory) | |
#create functions folder | |
Write-Verbose "[PROCESS] Creating folder functions under $path" | |
[void](New-Item -path $newPath -Name functions -ItemType Directory) | |
#create formats folder | |
Write-Verbose "[PROCESS] Creating folder formats under $path" | |
[void](New-Item -path $newPath -Name formats -ItemType Directory) | |
#create images folder | |
Write-Verbose "[PROCESS] Creating folder images under $path" | |
[void](New-Item -path $newPath -Name images -ItemType Directory) | |
#create docs folder | |
Write-Verbose "[PROCESS] Creating folder docs under $path" | |
$docs = New-Item -path $newPath -Name docs -ItemType Directory | |
#create .vscode folder | |
Write-Verbose "[PROCESS] Creating folder .vscode under $path" | |
$code = New-Item -path $newPath -Name .vscode -ItemType Directory | |
Copy-Item -path c:\scripts\tasks.json -Destination $code | |
#create module file | |
Write-Verbose "[PROCESS] Creating $name.psm1" | |
if ($CommandNames) { | |
$cmd = @() | |
foreach ($item in $CommandNames) { | |
Write-Verbose "[PROCESS] creating function scaffold for $item" | |
$f = @" | |
Function $item { | |
[cmdletbinding()] | |
Param( | |
) | |
Begin { | |
Write-Verbose "[BEGIN ] Starting: `$(`$MyInvocation.MyCommand)" | |
} #begin | |
Process { | |
Write-Verbose "[PROCESS] Processing" | |
} #process | |
End { | |
Write-Verbose "[END ] Ending: `$(`$MyInvocation.MyCommand)" | |
} #end | |
} #close $item | |
"@ | |
#create the file | |
$file = Join-Path -path $newPath -ChildPath "functions\$item.ps1" | |
Set-Content -Value $f -Path $file | |
} #foreach item | |
} #if command names | |
$myScript = @" | |
#region Main | |
Get-ChildItem -path `$PSScriptRoot\functions\*.ps1 | | |
ForEach-Object { . `$_.FullName} | |
#endregion | |
"@ | |
Set-Content -Value $myScript -Path "$newPath\$name.psm1" | |
#create manifest | |
Write-Verbose "[PROCESS] Creating $name.psd1" | |
$manHash = @{ | |
Path = "$newPath\$name.psd1" | |
RootModule = "$name.psm1" | |
Description = $Description | |
CompanyName = $License | |
Copyright = "$((Get-Date).year) $Lic | |
ense" | |
} | |
$cmdString = $CommandNames -join ',' | |
If ($CommandNames) { | |
$manHash.Add("FunctionsToExport", $cmdString) | |
} | |
New-ModuleManifest @manHash | |
Write-Verbose "[PROCESS] Creating About help topic outline" | |
if ($pscmdlet.ShouldProcess($docs.FullName, "New Markdown About Help")) { | |
New-MarkdownAboutHelp -OutputFolder $docs.FullName -AboutName $Name | |
} | |
#create Changelog.txt | |
Write-Verbose "[PROCESS] Creating Changelog.md" | |
Set-Content -Path $newPath\Changelog.md -Value "# Changelog for $Name" | |
#create README.md | |
Write-Verbose "[PROCESS] Creating README.md" | |
$readme = @" | |
# $Name | |
{INSERT CONTENT} | |
Last Updated _$(Get-Date -format u)_ | |
"@ | |
Set-Content -Value $readme -Path "$newPath\README.md" | |
#create License file | |
$lic = @" | |
Copyright (c) $((Get-Date).Year) $License | |
Permission is hereby granted, free of charge, to any person obtaining a copy | |
of this software and associated documentation files (the "Software"), to deal | |
in the Software without restriction, including without limitation the rights | |
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
copies of the Software, and to permit persons to whom the Software is | |
furnished to do so, subject to the following conditions: | |
The above copyright notice and this permission notice shall be included in | |
all copies or substantial portions of the Software. | |
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
THE SOFTWARE. | |
"@ | |
Write-Verbose "[PROCESS] Creating LICENSE.txt" | |
Set-Content -Value $lic -Path "$newPath\LICENSE.txt" | |
#create scratch files which my git config is set to ignore | |
Write-Verbose "[PROCESS] Creating scratch.ps1" | |
Set-Content -Value "#scratch file for $Name" -Path "$newPath\scratch.ps1" | |
Write-Verbose "[PROCESS] Creating scratch-change.md" | |
Set-Content -Value "# $Name" -Path "$newPath\scratch-change.md" | |
#create Test Folder | |
Write-Verbose "[PROCESS] Creating Tests folder" | |
$tests = New-Item -Path $newPath -Name tests -ItemType Directory | |
#Pester Init | |
Write-Verbose "[PROCESS] Running Pester setup" | |
#body of Test script | |
$TestInit = @" | |
BeforeAll { | |
. $PSCommandPath.Replace('.Tests.ps1', '.ps1') | |
} | |
`$here = Split-Path -Path `$MyInvocation.MyCommand.Path | |
`$parent = Split-Path -Path `$here | |
`$module = Split-Path -Path `$parent -Leaf | |
Write-Host "Importing module `$module from `$parent" -ForegroundColor Cyan | |
Import-Module `$parent -force | |
InModuleScope `$Module { | |
Describe $Name { | |
It "does something useful" { | |
`$true | Should Be `$true | |
} | |
} | |
} | |
"@ | |
if ($PSCmdlet.ShouldProcess("newPath", "Pester setup")) { | |
$PesterTest = Join-Path -Path $Tests.FullName -ChildPath "$name.tests.ps1" | |
Write-Verbose "[PROCESS] Creating $pestertest" | |
Set-Content -Value $TestInit -Path $PesterTest | |
Write-Verbose "[PROCESS] Git commit $pestertest" | |
} | |
#Git Init | |
Write-Verbose "[PROCESS] Running Git setup" | |
if ($PSCmdlet.ShouldProcess($newPath, "Git Init")) { | |
Write-Verbose "[PROCESS] Git: Init" | |
git init -q $newpath | |
Set-Location $newPath | |
#create Main and add all files | |
Write-Verbose "[PROCESS] Git: Add base Files" | |
git add . | |
Write-Verbose "[PROCESS] Git: Initial Commit" | |
git commit -a -q -m "Initial commit" | |
# $r = New-GitHubRepository -Name $name -NoWiki -Private -Raw -Description $Description | |
#give repo a chance to finish setting up online | |
#Start-Sleep -Seconds 5 | |
#Write-Verbose "[PROCESS] Git: git remote add origin $($r.clone_url)" | |
#git remote add origin "$($r.clone_url)" | |
#Start-Sleep -Seconds 5 | |
#create the Github remote using the GitHub CLI | |
if (-Not $NoGitHub) { | |
Try { | |
[void](Get-Command gh.exe -ErrorAction stop) | |
Write-Verbose "[PROCESS] Creating a new private GitHub repository $Name" | |
gh repo create $name --private --disable-wiki --description $Description | |
Write-Verbose "[PROCESS] Git: git push --set-upstream origin main" | |
git push --set-upstream origin main | |
#create initial branch | |
Write-Verbose "[PROCESS] Git: Create 0.0.1 branch" | |
git branch -q 0.0.1 | |
#checkout initial | |
Write-Verbose "[PROCESS] Git: Checkout 0.0.1 branch" | |
git checkout -q 0.0.1 | |
} | |
Catch { | |
Write-Warning "Can't find gh.exe. You will need to manually finish setting up the Github repo." | |
} | |
} #setup Github repo | |
} | |
else { | |
#simulate WhatIf processing for Git commands | |
Write-Host "What if: performing the operation git init -q $newPath" | |
Write-Host "What if: performing the operation git commit -a -q -m 'Initial commit'" | |
if (-not $NoGitHub) { | |
Write-Host "What if: Creating a new private GitHub repository $Name" | |
Write-Host "What if: performing the operation gh repo create $name --private --enable-wiki=false --description $Description --confirm" | |
Write-Host "What if: performing the operation git push --set-upstream origin main" | |
Write-Host "What if: performing the operation git branch -q 0.0.1" | |
Write-Host "What if: performing the operation git checkout -q 0.0.1" | |
} | |
} | |
} | |
else { | |
Write-Warning "$NewPath appears to already exist." | |
} | |
if (Test-Path -path $newPath) { | |
Set-Location $newPath | |
} | |
if ($Passthru) { | |
Get-ChildItem -Recurse | |
} | |
Write-Verbose "[END ] Ending: $($MyInvocation.Mycommand)" | |
} #close function |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Everything in this gist is offered as-is for educational purposes only. The script files are written around my personal routines. You are welcome to use them as models for your own work.