Files
Groupware/Project/_project_updater.js

177 lines
5.2 KiB
JavaScript

// C# 프로젝트 파일 자동 업데이트 헬퍼
// 새로운 파일을 생성할 때 EETGW.csproj에 자동으로 등록하는 스크립트
const fs = require('fs');
const path = require('path');
class ProjectUpdater {
constructor(projectPath = 'EETGW.csproj') {
this.projectPath = projectPath;
this.projectContent = '';
this.loadProject();
}
loadProject() {
try {
this.projectContent = fs.readFileSync(this.projectPath, 'utf8');
} catch (error) {
console.error('프로젝트 파일을 읽을 수 없습니다:', error.message);
}
}
/**
* 새로운 파일을 프로젝트에 등록
* @param {string} filePath - Web/wwwroot로 시작하는 상대 경로
* @param {string} fileType - 'Content' 또는 'None' (기본값: 'None')
*/
addFile(filePath, fileType = 'None') {
// 파일 경로를 백슬래시로 변경 (Windows 형식)
const windowsPath = filePath.replace(/\//g, '\\');
// 이미 등록된 파일인지 확인
if (this.isFileAlreadyRegistered(windowsPath)) {
console.log(`파일이 이미 등록되어 있습니다: ${windowsPath}`);
return false;
}
// 새로운 항목 생성
const newEntry = ` <${fileType} Include="${windowsPath}">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</${fileType}>`;
// 마지막 wwwroot 관련 항목 찾기
const lastWwwrootMatch = this.findLastWwwrootEntry();
if (lastWwwrootMatch) {
// 마지막 wwwroot 항목 다음에 삽입
const insertPosition = lastWwwrootMatch.index + lastWwwrootMatch[0].length;
this.projectContent =
this.projectContent.slice(0, insertPosition) +
'\n' + newEntry +
this.projectContent.slice(insertPosition);
return true;
}
console.error('wwwroot 섹션을 찾을 수 없습니다.');
return false;
}
/**
* 파일이 이미 등록되어 있는지 확인
*/
isFileAlreadyRegistered(filePath) {
const patterns = [
`Include="${filePath}"`,
`Include='${filePath}'`,
filePath.replace(/\\/g, '/') // 슬래시 형태도 확인
];
return patterns.some(pattern => this.projectContent.includes(pattern));
}
/**
* 마지막 wwwroot 관련 항목 찾기
*/
findLastWwwrootEntry() {
const wwwrootPattern = /<(?:Content|None) Include="Web\\wwwroot.*?<\/(?:Content|None)>/gs;
let lastMatch = null;
let match;
while ((match = wwwrootPattern.exec(this.projectContent)) !== null) {
lastMatch = match;
}
return lastMatch;
}
/**
* 프로젝트 파일 저장
*/
saveProject() {
try {
fs.writeFileSync(this.projectPath, this.projectContent, 'utf8');
console.log('프로젝트 파일이 업데이트되었습니다.');
return true;
} catch (error) {
console.error('프로젝트 파일 저장 실패:', error.message);
return false;
}
}
/**
* 여러 파일을 한 번에 등록
*/
addFiles(files) {
let hasChanges = false;
files.forEach(({ path, type = 'None' }) => {
if (this.addFile(path, type)) {
hasChanges = true;
console.log(`추가됨: ${path}`);
}
});
return hasChanges;
}
/**
* React 관련 파일들 자동 등록
*/
addReactFiles(basePath) {
const reactFiles = [
{ path: `${basePath}.html`, type: 'None' },
{ path: `${basePath}.jsx`, type: 'None' }
];
return this.addFiles(reactFiles);
}
}
// 사용 예시
function addNewReactComponent(componentName) {
const updater = new ProjectUpdater();
const basePath = `Web\\wwwroot\\react\\${componentName}`;
const files = [
{ path: `${basePath}.jsx`, type: 'None' },
{ path: `Web\\wwwroot\\react-${componentName.toLowerCase()}.html`, type: 'None' }
];
if (updater.addFiles(files)) {
updater.saveProject();
console.log(`${componentName} 컴포넌트 파일들이 프로젝트에 등록되었습니다.`);
}
}
// 일반 파일 추가
function addNewFile(filePath, fileType = 'None') {
const updater = new ProjectUpdater();
if (updater.addFile(filePath, fileType)) {
updater.saveProject();
console.log(`✅ 파일이 프로젝트에 등록되었습니다: ${filePath}`);
}
}
module.exports = {
ProjectUpdater,
addNewReactComponent,
addNewFile
};
// CLI에서 직접 실행할 수 있도록
if (require.main === module) {
const args = process.argv.slice(2);
if (args.length === 0) {
console.log('사용법: node _project_updater.js <파일경로> [파일타입]');
console.log('예시: node _project_updater.js "Web\\wwwroot\\react\\NewComponent.jsx" None');
process.exit(1);
}
const filePath = args[0];
const fileType = args[1] || 'None';
addNewFile(filePath, fileType);
}