tools/PublishModule.ps1

# Script should be executed manually by developer
$ModuleName = 'InstallModuleFromGit'

# check running folder
if (!(Test-Path "..\$ModuleName\$ModuleName.psd1")) {
    throw "We are not in correct folder, please run this tool as .\tools\PublishModule.ps1"
} else {
    "Checking module $(Resolve-Path "..\$ModuleName\$ModuleName.psd1")"
}

# test manifest
try {
    $Module = Test-ModuleManifest "$ModuleName.psd1" -ea Stop
    "Module $ModuleName.psd1 is OK"
} catch {
    throw 'Module manifest not in proper format'
}

# test version, must be x.y.z
if (($Module.Version.ToString() -split '\.').Count -lt 3) {
    throw "Module version must have three segments at least, currently it is $($Module.Version.ToString())"
} else {
    "Module version $($Module.Version.ToString()) is OK"
}

# test if remote is not the same
if (Find-Module -Name $ModuleName -RequiredVersion ($Module.Version) -Repository PSGallery -ea 0) {
    throw 'Module with same version already exists'
} else {
    "No module with version $($Module.Version) found online"
}

# get nuget key from somewhere?
if ($NugetKey) {
    "NugetKey found"
} else {
    throw 'Please define $NugetKey variable (run $NugetKey = Read-Host)'
}

# copy entire folder to temp location
if ($IsLinux -or $IsMacOS) {$Destination = '/tmp'}
else {$Destination = $Env:TEMP}

$Destination2 = Join-Path $Destination $ModuleName
"Copying to $Destination2"
if (Test-Path $Destination2) {Remove-Item $Destination2 -Recurse -Force}
Copy-Item -Path . -Destination $Destination -Recurse # it creates folder $ModuleName

# remove not needed files (starting with dot and from .gitignore)
"Removing not needed files"
[string[]]$Exclude = (Get-Content '.gitignore')
Get-ChildItem -Path $Destination2 -Recurse -Force | where Name -Match '^\.' | Remove-Item -Recurse -Force
Get-ChildItem -Path $Destination2 -Include $Exclude -Recurse -Force | Remove-Item -Recurse -Force

# publish
Read-Host "All prerequisites check. Press Enter to Publish module or Ctrl+C to abort"
Publish-Module -Path $Destination2 -Repository PSGallery -NuGetApiKey $NugetKey -Verbose
"Module $ModuleName published to PowerShell Gallery"