Directory.Build.props를 통합적으로 활용하는 방법

다수의 모듈로 구성된 프로젝트에서 버전 번호를 일관성 있게 관리해야 하는 이유는 무엇인가?

  • 동일한 패키지에 대해 서로 다른 버전이 사용될 경우, 예를 들어 모듈 A에서는 Serilog.Sinks.Async를 1.1.2 버전으로 사용하고, 모듈 B에서는 1.5.0 버전을 사용한다면, 최종 빌드된 항목에서는 버전 충돌 문제가 발생할 수 있습니다. 대부분의 경우 이는 무시해도 되지만, 배포 환경에서는 문제를 야기할 수 있습니다.
  • 자동 빌드 파이프라인을 운영하면서도 버전 관리를 중앙에서 통제하지 않으면, 빌드 대상 프로젝트(예: 배포용 C 프로젝트)가 최신 패키지 정보를 반영하지 못하게 됩니다. 특히 개발자 환경에서 해당 프로젝트를 열어 업데이트하지 않으면, GitLab 리포지토리 내의 버전 정의는 오래된 상태로 남아 있고, Docker 이미지 생성 및 실행 시 과거 패키지를 사용하게 됩니다.

Directory.Build.props의 작동 원리

Directory.Build.props는 .NET SDK 내장 기능이며, 빌드 시점에 현재 폴더부터 상위 폴더로 순차적으로 탐색하여 첫 번째 발견된 Directory.Build.props 파일을 적용합니다. 이는 NuGet.Config와 달리 단일 파일만 참조하며, 하위 디렉터리로의 상속 구조 없이 독립적으로 동작합니다.

주요 특징

  • 상속 불가: 하위 폴더에서 같은 이름의 파일을 정의해도 부모의 설정은 영향을 받지 않습니다.
  • 외부 파일 포함 가능: 일반적인 .csproj 파일과 마찬가지로 Import를 통해 다른 속성 파일을 포함할 수 있습니다.

공유 전략: 다중 환경에서의 적용

  1. HTTP 서버를 통한 파일 공유
    간단한 웹 서버(예: 배타 등)를 통해 Directory.Build.props 및 관련 설정 파일을 공유합니다. 모든 환경에서 동일한 버전 정보를 가져올 수 있도록 합니다.
  2. Windows 개발 환경 설정
    Visual Studio에서 Directory.Build.props를 직접 참조하도록 프로젝트 구조를 구성하고, 네트워크 경로 또는 로컬 복사본을 활용하여 지속적이고 안정적인 적용을 확보합니다.
  3. GitLab Runner에서 파일 다운로드
    빌드 스테이지에서 미리 필요한 설정 파일을 다운로드합니다.
    build-job:
      stage: build
      before_script:
        - bash $DOWNLOAD_ALL_DIRECTORY_BUILD_PROPS_FILES $DIRECTORY_BUILD_DIST_SERVER_DIRECTORYNAME
    이 스크립트는 특정 문서에서 제공되며, 커스텀 도커 이미지 제작 과정에 포함됩니다.
  4. 패키징 후 버전 정보 업데이트
    빌드 완료 후, 최신 버전 정보를 공유 서버에 반영합니다.
    update-version:
      stage: update-version
      script:
        - echo "SSH로 서버 접속하여 버전 업데이트..."
        - bash $DIRECTORY_BUILD_UPDATE_VERSION_SH $DIRECTORY_BUILD_DIST_SERVER_USER $DIRECTORY_BUILD_DIST_SERVER $DIRECTORY_BUILD_DIST_SERVER_DIRECTORYNAME "Directory.Build.Change.EasyComment.props" $EASY_COMMENT_VERSION_ID
    이 스크립트 역시 커스텀 도커 환경에 포함되어 있으며, 빌드 결과에 따라 자동으로 버전 정보를 동기화합니다.
  5. Docker 이미지 생성 시 파일 가져오기
    커스텀 SDK 이미지를 사용하여 빌드 단계에서 설정 파일을 자동으로 다운로드합니다.
    FROM docker.amicap.cn/amihome/dotnet/sdk8:2024 AS build
    WORKDIR /
    RUN /home/public/download-directory-builds-props.sh dev.amihome.cn
    기본 mcr.microsoft.com/dotnet/sdk:8.0 대신, 커스터마이징된 이미지를 사용함으로써 설정 파일을 자동으로 로드할 수 있도록 구성합니다.

태그: dotnet Directory.Build.props CI/CD GitLab Runner docker

7월 12일 01:22에 게시됨