프로젝트 관리에 있어 문서화는 필수적인 부분입니다. 특히, 마크다운(.md) 파일을 이용한 문서는 그 가독성과 편리함으로 개발자 사이에서 널리 사용되고 있습니다. Visual Studio와 같은 IDE에서 프로젝트의 .md 파일을 직접 관리하고 싶을 때, .csproj 파일에 단순히 다음과 같은 아이템 그룹을 추가함으로써 해결할 수 있습니다.

<ItemGroup>
  <None Include="**\*.md" />
</ItemGroup>

이렇게 하면, 솔루션 탐색기에서 .md 파일들을 쉽게 볼 수 있게 됩니다. 하지만, Unity 같은 환경에서는 상황이 조금 달라집니다. 

Unity는 코드를 빌드할 때마다 .csproj 파일을 자동으로 생성하고 업데이트합니다. 

이 과정에서 우리가 수동으로 추가한 <ItemGroup> 설정이 지워질 수 있습니다. 

따라서, 프로젝트에 직접 이 아이템 그룹을 추가하는 것이 번거롭고, 심지어는 무의미해질 수 있습니다. 

 

이 문제에 대한 해결책은 Unity 빌드 프로세스가 완료된 후에 .csproj 파일을 자동으로 수정하여 <ItemGroup>을 추가하는 방식입니다. 

이렇게 하면, 빌드 과정에서 자동 생성된 .csproj 파일에 우리가 원하는 설정을 유지할 수 있게 됩니다. 

 

이러한 방식의 구현은 CsprojModifier라는 간단한 스크립트를 통해 가능합니다. 

이 스크립트는 Unity의 자산 후처리 기능을 활용하여, 빌드가 완료될 때마다 자동으로 .csproj 파일을 수정하고, 우리가 정의한 <ItemGroup>을 추가합니다. 

이를 통해, 마크다운 파일들을 솔루션 탐색기에서 쉽게 관리하고 접근할 수 있게 됩니다. 

 

이 방법은 Unity 개발 환경에서 프로젝트의 문서화를 용이하게 하며, 개발자가 프로젝트 내의 문서를 더욱 효과적으로 관리할 수 있게 해줍니다. 

더 이상 수동으로 파일을 관리하거나, 빌드 과정에서 설정이 사라지는 문제에 신경 쓸 필요가 없습니다. 

CsprojModifier 스크립트의 도움으로, 자동화된 프로세스를 통해 프로젝트의 문서 관리를 한층 더 간편하고 효율적으로 만들 수 있습니다.

 

Editor 폴더에 스크립트추가

using System;
using System.IO;
using UnityEditor;
using System.Linq;

public class CsprojModifier : AssetPostprocessor {
    public static string OnGeneratedCSProject(string path, string content)
    {
        if (path.EndsWith(".csproj")) {
            int asmdefIndex = content.IndexOf(".asmdef\"", StringComparison.Ordinal);
            while (asmdefIndex > -1) {
                // .asmdef 파일까지의 경로를 찾습니다.
                int pathStart = content.LastIndexOf("<None Include=\"", asmdefIndex, StringComparison.Ordinal) + 15;
                int pathEnd = asmdefIndex + 7; // ".asmdef" 문자열 길이를 더해줍니다.
                string asmdefPath = content.Substring(pathStart, pathEnd - pathStart).Replace("/", "\\");

                // 디렉토리 경로를 추출합니다.
                string directoryPath = Path.GetDirectoryName(asmdefPath)?.Replace("/", "\\");
                if (!string.IsNullOrEmpty(directoryPath)) {
                    // 해당 디렉토리 내의 모든 .md 파일을 찾습니다.
                    var mdFiles = Directory.GetFiles(directoryPath, "*.md", SearchOption.AllDirectories)
                        .Select(filePath => filePath.Replace("/", "\\")); // 경로 포맷을 백슬래시로 변환

                    if (mdFiles.Any()) {
                        // .md 파일들을 포함시키는 ItemGroup 섹션을 생성합니다.
                        string itemGroupToAdd = "\n  <ItemGroup>\n";
                        foreach (var mdFile in mdFiles) {
                            // 프로젝트 경로를 기반으로 한 상대 경로로 변환합니다.
                            string relativePath = mdFile.Substring(directoryPath.Length).TrimStart('\\');
                            itemGroupToAdd += $"    <None Include=\"{directoryPath}\\{relativePath}\" />\n";
                        }
                        itemGroupToAdd += "  </ItemGroup>\n";

                        // .csproj 파일의 끝부분에 .md 파일들을 포함시키는 ItemGroup 섹션을 추가합니다.
                        int lastIndex = content.LastIndexOf("</Project>", StringComparison.Ordinal);
                        if (lastIndex != -1) {
                            content = content.Insert(lastIndex, itemGroupToAdd);
                        }
                    }
                }

                // 다음 .asmdef 파일을 찾습니다.
                asmdefIndex = content.IndexOf(".asmdef\"", asmdefIndex + 1, StringComparison.Ordinal);
            }
        }
        return content;
    }
}

 

반응형

'Programming > Unity' 카테고리의 다른 글

FBX Exporter  (0) 2024.02.03
newtonsoft Json 추가하기, TypeNameHandling 설정하기  (0) 2023.08.07
Unity Addressable  (0) 2021.12.22
GraphicsRaycast  (0) 2019.12.31
TextMeshPro 한글 사용  (0) 2018.09.30
유니티 에디터 모드 UI 샘플 메모  (0) 2018.01.23
멀티 접속 테스트  (0) 2018.01.14
유니티 프로젝트 목록 삭제  (0) 2017.12.14