[cs] msbuil로 C# 프로젝트 빌드 시 project.assets.json 오류 해결 방법

@codemaru · November 30, 2023 · 4 min read

msbuild project.sln -m -t "cslib" -p:Configuration=Release -p:Arch=AnyCPU

우리는 대략 이런 커맨드로 msbuild를 사용하고 있었다. project.sln에는 다수의 프로젝트가 포함되어 있고, cslib 그 중에 하나인 c# 프로젝트였다. 그런데 이상한게 Visual Studio에서 빌드하면 멀쩡하게 빌드가 잘되는데 msbuild로만 실행하면 project.assets.json 파일이 없다며 오류가 발생했다.

첫번째 문제는 경로였다. 우리는 프로젝트의 중간 파일과 출력 파일을 다른 경로로 지정해놓고 사용했는데 nuget이 생성하는 project.assets.json 파일은 그 경로가 아닌 디폴트 경로를 참조하는 것 같았다. 이를 해결하기 위해서는 cslib 프로젝트 파일이 있는 경로에 Directory.Build.props 파일을 생성한 다음 아래와 같이 설정해 주면 된다.

<Project>
  <PropertyGroup>
    <BaseIntermediateOutputPath>경로</BaseIntermediateOutputPath>
  </PropertyGroup>
</Project>

경로에는 C# 프로젝트에서 설정한 것과 동일한 중간 파일 경로를 입력하면 된다. $(SolutionDir) 같은 변수도 지원하기 때문에 그대로 사용하면 된다.

이제는 잘 되겠지?! 하고는 했는데 여전히 되지 않았다. 온갖 오류 메시지를 하나씩 추적하면서 수정하는 온갖 삽질을 ChatGPT와 함께하고 알게 되었다. project.sln 파일이 AnyCPU에 대해서 정상적으로 설정돼 있지 않으면 nuget이 project.assets.json 파일을 생성을 못한다. 예를들어 포함된 test 프로젝트가 AnyCPU에 대해서 빌드 설정이 체크되어 있지 않으면 생성이 되지 않는 식이다. 또는 솔루션 파일에 포함된 구성 요소 프로젝트가 없어도 생성이 되지 않는다. 이런 모든 원리를 살펴보면 위 커맨드를 수행할 때 아래 커맨드가 먼저 수행되는 것으로 보여진다.

msbuild project.sln -t "restore"

즉, 솔루션 전체를 복원하는 것이다. 나는 cslib만 빌드하고 싶을 뿐인데 말이다. 그래서 ChatGPT와 함께 열심히 찾아 보았지만 개별 프로젝트를 복원하는 방법은 없어 보였다. 그렇다면 어쩌지?! 솔루션을 멀쩡하게 만들어야 하나? 그러기엔 외부 참조가 많아서 빌드서버에서 clone해야 할게 너무 많아지는 문제가 있었다. ChatGPT는 다음과 같은 방법을 나에게 대안으로 알려주었다.

msbuild cslib.csproj -m -t "restore,rebuilt" -p:Configuration=Release -p:Arch=AnyCPU

오 역시 ChatGPT. 바로 이거였어, 하고는 테스트를 했는데 한가지 추가적인 문제가 있었다. $(SolutionDir)이었다. 이는 프로젝트 파일을 직접 참조하기 때문에 $(SolutionDir)이 정의되지 않은 상태인 것이다. 다시 ChatGPT를 독촉하자. 완벽한 커맨드를 알려주었다.

msbuild cslib.csproj -m -t "restore,rebuilt" -p:Configuration=Release -p:Arch=AnyCPU -p:SolutionDir=path/to/solution

얼마간 삽질했지만 정상적으로 빌드되도록 만들 수 있었다.

@codemaru
돌아보니 좋은 날도 있었고, 나쁜 날도 있었다. 그런 나의 모든 소소한 일상과 배움을 기록한다. 여기에 기록된 모든 내용은 한 개인의 관점이고 의견이다. 내가 속한 조직과는 1도 상관이 없다.
(C) 2001 YoungJin Shin, 0일째 운영 중