Major project reorganization: Centralized version management and improved structure

- Reorganized project structure with proper directory separation:
  * All scripts moved to scripts/ directory (including examples)
  * All documentation moved to docs/ directory (except README.md)
  * Centralized version management in Version.ps1

- Implemented centralized version management system:
  * Version.ps1 provides single source of truth for version information
  * Automatic yyyy.MM.dd.HHmm versioning based on build time
  * scripts/Update-Version.ps1 updates all version references
  * src/Properties/AssemblyInfo.cs for assembly version information

- Enhanced build system:
  * scripts/Build.ps1 - Full build with validation and packaging
  * scripts/Quick-Build.ps1 - Fast build handling file locking issues
  * Removed automatic copy from project file to avoid locking
  * Integrated version updates into build process

- Updated PowerShell Gallery publishing:
  * scripts/Publish-PSMinIOToGallery.ps1 updated for new structure
  * docs/POWERSHELL-GALLERY-RELEASE.md comprehensive publishing guide
  * Module manifest updated with proper metadata and release notes

- Updated all documentation and examples:
  * README.md updated with PowerShell Gallery installation
  * All example scripts updated with correct import paths
  * scripts/examples/README.md updated for new location
  * docs/PROJECT-STRUCTURE.md documents new organization

- Version updated to 2025.07.11.1151 with centralized management
- All import paths corrected for new structure
- Professional project organization following PowerShell best practices
This commit is contained in:
PSMinIO Developer
2025-07-11 11:53:08 -04:00
parent 677fa8c172
commit 90c64d3237
24 changed files with 1704 additions and 64 deletions
+244
View File
@@ -0,0 +1,244 @@
# PowerShell Gallery Release Script for PSMinIO
# This script prepares and publishes the PSMinIO module to PowerShell Gallery
[CmdletBinding()]
param(
[Parameter(Mandatory = $false)]
[string]$NuGetApiKey,
[Parameter(Mandatory = $false)]
[switch]$WhatIf,
[Parameter(Mandatory = $false)]
[switch]$Force,
[Parameter(Mandatory = $false)]
[string]$Repository = "PSGallery"
)
# Set error action preference
$ErrorActionPreference = "Stop"
# Define paths
$ProjectRoot = Split-Path $PSScriptRoot -Parent
$ModulePath = Join-Path $ProjectRoot "Module\PSMinIO"
$ManifestPath = Join-Path $ModulePath "PSMinIO.psd1"
$PublishPath = Join-Path $ProjectRoot "Publish"
function Write-Status {
param([string]$Message, [string]$Type = "Info")
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
switch ($Type) {
"Success" { Write-Host "[$timestamp] ✅ $Message" -ForegroundColor Green }
"Warning" { Write-Host "[$timestamp] ⚠️ $Message" -ForegroundColor Yellow }
"Error" { Write-Host "[$timestamp] ❌ $Message" -ForegroundColor Red }
default { Write-Host "[$timestamp] $Message" -ForegroundColor Cyan }
}
}
function Test-ModuleStructure {
Write-Status "Validating module structure..."
# Check if manifest exists
if (-not (Test-Path $ManifestPath)) {
throw "Module manifest not found at: $ManifestPath"
}
# Test manifest
try {
$manifest = Test-ModuleManifest -Path $ManifestPath -ErrorAction Stop
Write-Status "Module manifest is valid" "Success"
Write-Status "Module: $($manifest.Name) v$($manifest.Version)"
Write-Status "Author: $($manifest.Author)"
Write-Status "Description: $($manifest.Description)"
return $manifest
} catch {
throw "Module manifest validation failed: $($_.Exception.Message)"
}
}
function Test-RequiredFiles {
param($Manifest)
Write-Status "Checking required files..."
$requiredFiles = @(
"bin\PSMinIO.dll",
"bin\Minio.dll",
"types\PSMinIO.Types.ps1xml",
"types\PSMinIO.Format.ps1xml"
)
foreach ($file in $requiredFiles) {
$filePath = Join-Path $ModulePath $file
if (-not (Test-Path $filePath)) {
throw "Required file missing: $file"
}
Write-Status "✓ Found: $file"
}
Write-Status "All required files present" "Success"
}
function Test-ModuleFunctionality {
Write-Status "Testing module functionality..."
try {
# Import the module
Import-Module $ManifestPath -Force -ErrorAction Stop
Write-Status "✓ Module imported successfully"
# Test cmdlet availability
$expectedCmdlets = @(
'Connect-MinIO',
'Get-MinIOBucket',
'New-MinIOBucket',
'Remove-MinIOBucket',
'Test-MinIOBucketExists',
'Get-MinIOObject',
'New-MinIOObject',
'New-MinIOObjectChunked',
'New-MinIOFolder',
'Get-MinIOObjectContent',
'Get-MinIOObjectContentChunked',
'Remove-MinIOObject',
'Get-MinIOBucketPolicy',
'Set-MinIOBucketPolicy',
'Get-MinIOStats'
)
$availableCmdlets = Get-Command -Module PSMinIO | Select-Object -ExpandProperty Name
foreach ($cmdlet in $expectedCmdlets) {
if ($cmdlet -in $availableCmdlets) {
Write-Status "✓ Cmdlet available: $cmdlet"
} else {
throw "Expected cmdlet not found: $cmdlet"
}
}
Write-Status "All expected cmdlets are available" "Success"
# Remove module
Remove-Module PSMinIO -Force -ErrorAction SilentlyContinue
} catch {
throw "Module functionality test failed: $($_.Exception.Message)"
}
}
function Prepare-PublishDirectory {
param($Manifest)
Write-Status "Preparing publish directory..."
# Clean and create publish directory
if (Test-Path $PublishPath) {
Remove-Item $PublishPath -Recurse -Force
}
New-Item -ItemType Directory -Path $PublishPath -Force | Out-Null
# Create module directory in publish path
$publishModulePath = Join-Path $PublishPath "PSMinIO"
New-Item -ItemType Directory -Path $publishModulePath -Force | Out-Null
# Copy module files
Copy-Item -Path "$ModulePath\*" -Destination $publishModulePath -Recurse -Force
Write-Status "Module prepared in: $publishModulePath" "Success"
return $publishModulePath
}
function Test-PowerShellGalleryConnection {
Write-Status "Testing PowerShell Gallery connection..."
try {
$repo = Get-PSRepository -Name $Repository -ErrorAction Stop
Write-Status "✓ Repository '$Repository' is available"
Write-Status " Source: $($repo.SourceLocation)"
Write-Status " Publish: $($repo.PublishLocation)"
if ($repo.InstallationPolicy -eq "Untrusted") {
Write-Status "Repository is marked as Untrusted - this is normal for PSGallery" "Warning"
}
} catch {
throw "Failed to connect to repository '$Repository': $($_.Exception.Message)"
}
}
function Publish-ModuleToGallery {
param($PublishModulePath, $Manifest)
if ($WhatIf) {
Write-Status "WhatIf: Would publish module to PowerShell Gallery" "Warning"
Write-Status "Module: $($Manifest.Name) v$($Manifest.Version)"
Write-Status "Path: $PublishModulePath"
Write-Status "Repository: $Repository"
return
}
if (-not $NuGetApiKey) {
Write-Status "NuGetApiKey not provided. Please provide your PowerShell Gallery API key." "Warning"
$NuGetApiKey = Read-Host -Prompt "Enter your PowerShell Gallery API Key" -AsSecureString
$NuGetApiKey = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto([System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($NuGetApiKey))
}
Write-Status "Publishing module to PowerShell Gallery..."
try {
$publishParams = @{
Path = $PublishModulePath
Repository = $Repository
NuGetApiKey = $NuGetApiKey
Force = $Force
Verbose = $true
}
Publish-Module @publishParams
Write-Status "Module published successfully!" "Success"
Write-Status "It may take a few minutes to appear in search results"
} catch {
throw "Failed to publish module: $($_.Exception.Message)"
}
}
# Main execution
try {
Write-Status "Starting PowerShell Gallery release process for PSMinIO"
Write-Status "Repository: $Repository"
Write-Status "WhatIf: $WhatIf"
# Step 1: Validate module structure
$manifest = Test-ModuleStructure
# Step 2: Check required files
Test-RequiredFiles -Manifest $manifest
# Step 3: Test module functionality
Test-ModuleFunctionality
# Step 4: Test PowerShell Gallery connection
Test-PowerShellGalleryConnection
# Step 5: Prepare publish directory
$publishModulePath = Prepare-PublishDirectory -Manifest $manifest
# Step 6: Final validation of prepared module
Write-Status "Final validation of prepared module..."
$finalManifest = Test-ModuleManifest -Path (Join-Path $publishModulePath "PSMinIO.psd1")
Write-Status "Final validation successful" "Success"
# Step 7: Publish to gallery
Publish-ModuleToGallery -PublishModulePath $publishModulePath -Manifest $finalManifest
Write-Status "PowerShell Gallery release process completed successfully!" "Success"
Write-Status "Module: PSMinIO v$($finalManifest.Version)"
Write-Status "Check status at: https://www.powershellgallery.com/packages/PSMinIO"
} catch {
Write-Status "Release process failed: $($_.Exception.Message)" "Error"
exit 1
}