netcore-blueprint
Version:
A custom project blueprint
158 lines (123 loc) โข 5.24 kB
JavaScript
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`,
];
}