UNPKG

netcore-blueprint

Version:

A custom project blueprint

158 lines (123 loc) โ€ข 5.24 kB
#!/usr/bin/env node const { findSolutionFileFixed, copyRecursive, addProjectReferencesToCsproj } = require('../lib/replacer'); const fs = require('fs'); const path = require('path'); const { execSync } = require('child_process'); // ===================================================== // Param = Source Module Name (also base for new module) // Example: copy-module __MODULE__ // Will create: __MODULE__Module // ===================================================== const sourceModuleName = process.argv[2]; const targetFolder = process.argv[3]; const force = process.argv.includes('--force'); if (!sourceModuleName || !targetFolder) { console.error('Usage: copy-module <ModuleName> <TargetFolder>'); process.exit(1); } // Assume current working directory is Modules/ const modulesPath = process.cwd(); const templateRoot = path.join(modulesPath, sourceModuleName); const targetModuleRoot = path.join(modulesPath, '..', targetFolder, 'Modules', `${sourceModuleName}Module`); const solutionFile = findSolutionFileFixed(modulesPath, targetFolder); if (!fs.existsSync(templateRoot)) { console.error(`โŒ Source module folder not found: ${templateRoot}`); process.exit(1); } if (fs.existsSync(targetModuleRoot)) { if (!force) { console.error(`โŒ Target module already exists: ${targetModuleRoot}`); console.error(` Use --force to overwrite.`); process.exit(1); } console.log(`๐Ÿ”ฅ --force detected. Removing existing module: ${targetModuleRoot}`); fs.rmSync(targetModuleRoot, { recursive: true, force: true }); } if (!solutionFile) { console.error("โŒ Could not find .sln file in parent directories."); process.exit(1); } console.log(`๐Ÿš€ Cloning module template:`); console.log(` From: ${templateRoot}`); console.log(` To: ${targetModuleRoot}`); console.log(`๐Ÿงฉ Solution: ${solutionFile}`); const hostApiProjectPath = path.join( path.dirname(solutionFile), 'Host', 'Host.API', 'Host.API.csproj' ); // ===================================================== // 1. Create module root // ===================================================== fs.mkdirSync(targetModuleRoot, { recursive: true }); // ===================================================== // 2. Create projects // ===================================================== const projects = [ { name: `${sourceModuleName}Module.API`, type: 'classlib' }, { name: `${sourceModuleName}Module.Core`, type: 'classlib' }, { name: `${sourceModuleName}Module.Infrastructure`, type: 'classlib' }, ]; projects.forEach(p => { console.log(`๐Ÿ“ฆ Creating project: ${p.name}`); execSync(`dotnet new ${p.type} -n ${p.name}`, { cwd: targetModuleRoot, stdio: 'inherit' }); const projectPath = path.join(targetModuleRoot, p.name); // ===================================================== // 2.1 Remove default Class1.cs generated by dotnet new // ===================================================== const defaultClassFile = path.join(projectPath, 'Class1.cs'); if (fs.existsSync(defaultClassFile)) { console.log(`๐Ÿงน Removing default file: ${defaultClassFile}`); fs.unlinkSync(defaultClassFile); } // ===================================================== // 3. Copy template files (no csproj) // ===================================================== const templateSubFolder = path.join(templateRoot, p.name); if (!templateSubFolder || !fs.existsSync(templateSubFolder)) { console.warn(`โš ๏ธ Template subfolder not found: ${templateSubFolder}`); return; } console.log(`๐Ÿ“„ Copying template from: ${templateSubFolder}`); copyRecursive(templateSubFolder, projectPath); }); // ===================================================== // 4. Add projects to solution // ===================================================== projects.forEach(p => { const csproj = path.join( targetModuleRoot, p.name, `${p.name}.csproj` ); console.log(`โž• Adding to solution: ${csproj}`); execSync(`dotnet sln "${solutionFile}" add "${csproj}"`, { stdio: 'inherit' }); }); console.log('๐Ÿ”„ Restoring NuGet packages...'); execSync(`dotnet restore "${solutionFile}"`, { stdio: 'inherit' }); console.log('๐Ÿ—๏ธ Building solution...'); execSync(`dotnet build "${solutionFile}"`, { stdio: 'inherit' }); console.log(`๐ŸŽ‰ Module "${sourceModuleName}Module" created successfully!`); console.log('๐Ÿ”— Auto-adding module references to HostAPI...'); addModuleReferencesToHostApi(sourceModuleName, hostApiProjectPath); // ===================================================== // Helpers // ===================================================== function addModuleReferencesToHostApi(moduleName, hostApiCsprojPath) { const refs = buildStaticProjectRefs(moduleName); addProjectReferencesToCsproj(hostApiCsprojPath, refs); } // Build refs (giแปฏ nguyรชn logic cลฉ) function buildStaticProjectRefs(moduleName) { return [ `..\\..\\Modules\\${moduleName}Module\\${moduleName}Module.API\\${moduleName}Module.API.csproj`, `..\\..\\Modules\\${moduleName}Module\\${moduleName}Module.Core\\${moduleName}Module.Core.csproj`, `..\\..\\Modules\\${moduleName}Module\\${moduleName}Module.Infrastructure\\${moduleName}Module.Infrastructure.csproj`, ]; }