Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (seongtaejeong at gmail.com)
홈페이지
첨부 파일
 
(연관된 글이 1개 있습니다.)
(시리즈 글이 7개 있습니다.)
사물인터넷: 9. Visual Studio 2017에서 Raspberry Pi C++ 응용 프로그램 제작
; https://www.sysnet.pe.kr/2/0/11358

개발 환경 구성: 339. WSL을 이용해 윈도우 PC 1대에서 Linux 응용 프로그램을 Visual Studio로 개발하는 방법
; https://www.sysnet.pe.kr/2/0/11390

개발 환경 구성: 340. WSL을 이용해 윈도우 PC 1대에서 openSUSE 응용 프로그램을 Visual Studio로 개발하는 방법
; https://www.sysnet.pe.kr/2/0/11391

개발 환경 구성: 428. Visual Studio 2019 - CMake를 이용한 리눅스 빌드 환경 설정
; https://www.sysnet.pe.kr/2/0/11825

개발 환경 구성: 431. Visual Studio 2019 - CMake를 이용한 공유/실행(so/out) 리눅스 프로젝트 설정
; https://www.sysnet.pe.kr/2/0/11833

개발 환경 구성: 434. Visual Studio 2019 - 리눅스 프로젝트를 이용한 공유/실행(so/out) 프로그램 개발 환경 설정
; https://www.sysnet.pe.kr/2/0/11844

개발 환경 구성: 727. Visual C++ - 리눅스 프로젝트를 위한 빌드 서버의 msbuild 구성
; https://www.sysnet.pe.kr/2/0/13737




Visual C++ - 리눅스 프로젝트를 위한 빌드 서버의 msbuild 구성

리눅스 프로젝트의 경우,

Visual Studio 2019 - 리눅스 프로젝트를 이용한 공유/실행(so/out) 프로그램 개발 환경 설정
; https://www.sysnet.pe.kr/2/0/11844

빌드를 위해 반드시 리눅스 서버 또는 WSL을 필요로 합니다. 비주얼 스튜디오에서는 이런 연결을 개별 프로젝트에서 관리하지 않고 "Tools" / "Options" 메뉴로 뜨는 "Cross Platform" / "Connection Manager"에서 관리하는데요,

[그림 1: Connection Manager]
vs_remote_ssh_1.png

이렇게 구성한 설정은 %LOCALAPPDATA%\Microsoft\Linux\User Data\3.0\store.xml에 별도로 저장됩니다.

사실 개발자 1명이 프로젝트를 관리하는 상황이라면 위와 같은 방식이 문제가 되진 않지만, 여러 개발자가 하나의 프로젝트를 함께 참여하는 상황이라면 다소 불편한 점이 있습니다. 또는, 빌드 서버를 구성한 경우에도 저건 문제가 됩니다. 가령, github에 올린 프로젝트를 빌드 서버에서 받아 컴파일하려고 할 때, 개발자 PC와는 달리 원격 리눅스 서버에 대한 정보가 없어 당연히 빌드가 실패하게 됩니다.

어쩔 수 없이 빌드 서버에서도 리눅스 서버에 대한 정보를 등록해야 하고, 이럴 때 ConnectionManager.exe를 이용할 수 있습니다.

// 아래는 키 파일 경로를 %USERPROFILE%에 설정했으므로 빌드 스크립트를 실행하는 계정이 다르다면 주의해야 합니다.

C:\temp> ConnectionManager.exe add testusr@192.168.100.50 --privatekey "%USERPROFILE%\.ssh\test_rsa"

일단 저렇게 전역적으로 (store.xml에) 등록했어도 빌드에 문제가 발생할 여지가 여전히 남아 있습니다. 왜냐하면, vcxproj 프로젝트 파일에는 그것을 빌드하기 위한 리눅스 서버 정보를 포함하지 않기 때문입니다.

그래서, "그림 1"처럼 구성된 환경에서 msbuild를 이용해 vcxproj 파일을 빌드하면,

c:\temp> msbuild ConsoleApplication1.vcxproj /p:Platform=ARM64 /t:rebuild

msbuild는 "그림 1"의 "Default" 칼럼에 선택된 "192.168.105.25" 서버를 자동으로 선택해 빌드를 수행합니다. 물론, 1개만 등록돼 있다면 문제가 없겠지만, 만약 빌드 서버에서 x64, ARM64 프로젝트를 빌드하도록 스크립트를 구성했다면,

// "Default"로 선택한 리눅스 서버에서 빌드
c:\temp> msbuild ConsoleApplication1.vcxproj /p:Platform=ARM64 /t:rebuild

// "Default"로 선택한 리눅스 서버에서 빌드
c:\temp> msbuild ConsoleApplication1.vcxproj /p:Platform=x64 /t:rebuild

당연히 둘 중의 하나는 플랫폼이 맞지 않는 결과를 가져옵니다.




비주얼 스튜디오 환경에서 각각의 개발자는 Visual C++ 프로젝트 속성 창에서 "Remote Build Machine"을 설정할 수 있습니다.

vs_remote_ssh_2.png

하지만, 이 정보는 (위의 예제에서) ConsoleApplication1.vcxproj 파일에 저장되지 않고 별도로 ConsoleApplication1.vcxproj.user 파일에 저장됩니다. 즉, 소스코드의 형상관리에서 제외되기 때문에 빌드 서버에서 소스 코드를 가져와도 저 파일은 공유되지 않는 것입니다.

대신 해당 설정은 msbuild를 따르기 때문에 원한다면 *.vcxproj.user 내용을 *.vcxproj 파일에 적용해도 됩니다. 예를 들어, user 파일은 다음의 내용을 담고 있는데,

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
    <RemoteTarget>1638701483;192.168.105.25 (username=, port=22, authentication=Password)</RemoteTarget>
  </PropertyGroup>
</Project>

이 설정을 vcxproj에 그대로 이식할 수 있습니다.

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  ...[생략]...

  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
  ...[생략]...
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
    <UseDebugLibraries>false</UseDebugLibraries>
    <PlatformToolset>Remote_GCC_1_0</PlatformToolset>
    <RemoteTarget>1365766831;169.254.238.200 (username=, port=22, authentication=Password)</RemoteTarget>
  </PropertyGroup>
  ...[생략]...
</Project>

이것을 이용하면, 빌드 서버를 위해 "'$(Configuration)|$(Platform)'=='Release|x64'"와 같이 Release 빌드의 경우 RemoteTarget으로 지정한 외부 서버에서 수행하도록 할 수 있습니다. 반면, 개발자 PC에서는 user 파일에 Debug 빌드를 둬 각자가 원하는 서버로 빌드하는 유연함을 가질 수 있습니다.




또 다른 방법으로는, msbuild 명령줄에서 /p:RemoteTarget=... 옵션을 직접 전달하는 것입니다. 이때의 인자는 ConnectionManager.exe를 통해 구한 "Connection ID"를 쓰면 됩니다.

C:\temp> ConnectionManager.exe list
Reading stored connections from 'C:\Users\testu\AppData\Local\Microsoft\Linux\User Data\3.0\store.xml'

Connection ID |            Host | Username | Port | Authentication Type
-----------------------------------------------------------------------
    567696872 |       127.0.0.1 |    testu |   22 | Password
   1365766831 | 169.254.238.200 |    testu |   22 | Password
   1638701483 |  192.168.105.25 |    testu |   22 | Password

아래는 그 예제입니다.

// 169.254.238.200 서버는 ARM64 서버로 가정,
c:\temp> msbuild ConsoleApplication1.vcxproj /p:RemoteTarget=1365766831 /p:Platform=ARM64;Configuration=Release / /t:rebuild

// 192.168.105.25 서버는 x64용 서버로 가정,
c:\temp> msbuild ConsoleApplication1.vcxproj /p:RemoteTarget=1638701483 /p:Platform=x64;Configuration=Release / /t:rebuild

아마도 대부분의 경우, 리눅스 빌드로는 x64, ARM64 2가지 정도를 지원하게 될 텐데요, 그렇다면 자연스럽게 컨테이너를 이용한 빌드를 하게 될 것이고, 결국 fingerprint에 대한 관리까지 고려해야 할 것입니다. ^^




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 9/21/2024]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




1  2  3  4  5  6  7  8  9  10  11  12  13  14  [15]  ...
NoWriterDateCnt.TitleFile(s)
13566정성태2/27/20249542오류 유형: 897. Windows 7 SDK 설치 시 ".NET Development" 옵션이 비활성으로 선택이 안 되는 경우
13565정성태2/23/20248637닷넷: 2219. .NET CLR2 보안 모델에서의 개별 System.Security.Permissions 제어
13564정성태2/22/202410152Windows: 259. Hyper-V Generation 1 유형의 VM을 Generation 2 유형으로 바꾸는 방법
13563정성태2/21/20249645디버깅 기술: 196. windbg - async/await 비동기인 경우 메모리 덤프 분석의 어려움
13562정성태2/21/20249344오류 유형: 896. ASP.NET - .NET Framework 기본 예제에서 System.Web에 대한 System.IO.FileNotFoundException 예외 발생
13561정성태2/20/202410145닷넷: 2218. C# - (예를 들어, Socket) 비동기 I/O에 대한 await 호출 시 CancellationToken을 이용한 취소파일 다운로드1
13560정성태2/19/202410196디버깅 기술: 195. windbg 분석 사례 - Semaphore 잠금으로 인한 Hang 현상 (닷넷)
13559정성태2/19/202411010오류 유형: 895. ASP.NET - System.Security.SecurityException: 'Requested registry access is not allowed.'
13558정성태2/18/202410182닷넷: 2217. C# - 최댓값이 1인 SemaphoreSlim 보다 Mutex 또는 lock(obj)를 선택하는 것이 나은 이유
13557정성태2/18/20249057Windows: 258. Task Scheduler의 Author 속성 값을 변경하는 방법
13556정성태2/17/20249431Windows: 257. Windows - Symbolic (hard/soft) Link 및 Junction 차이점
13555정성태2/15/20249644닷넷: 2216. C# - SemaphoreSlim 사용 시 주의점
13554정성태2/15/20249071VS.NET IDE: 189. Visual Studio - 닷넷 소스코드 디컴파일 찾기가 안 될 때
13553정성태2/14/20248607닷넷: 2215. windbg - thin/fat lock 없이 동작하는 Monitor.Wait + Pulse
13552정성태2/13/20248730닷넷: 2214. windbg - Monitor.Enter의 thin lock과 fat lock
13551정성태2/12/20249818닷넷: 2213. ASP.NET/Core 웹 응용 프로그램 - 2차 스레드의 예외로 인한 비정상 종료
13550정성태2/11/202410264Windows: 256. C# - Server socket이 닫히면 Accept 시켰던 자식 소켓이 닫힐까요?
13549정성태2/3/202411235개발 환경 구성: 706. C# - 컨테이너에서 실행하기 위한 (소켓) 콘솔 프로젝트 구성
13548정성태2/1/202410802개발 환경 구성: 705. "Docker Desktop for Windows" - ASP.NET Core 응용 프로그램의 소켓 주소 바인딩(IPv4/IPv6 loopback, Any)
13547정성태1/31/202410453개발 환경 구성: 704. Visual Studio - .NET 8 프로젝트부터 dockerfile에 추가된 "USER app" 설정
13546정성태1/30/202410143Windows: 255. (디버거의 영향 등으로) 대상 프로세스가 멈추면 Socket KeepAlive로 연결이 끊길까요?
13545정성태1/30/20249683닷넷: 2212. ASP.NET Core - 우선순위에 따른 HTTP/HTTPS 호스트:포트 바인딩 방법
13544정성태1/30/20249340오류 유형: 894. Microsoft.Data.SqlClient - Could not load file or assembly 'System.Security.Permissions, ...'
13543정성태1/30/20249764Windows: 254. Windows - 기본 사용 중인 5357 포트 비활성화는 방법
13542정성태1/30/20248841오류 유형: 893. Visual Studio - Web Application을 실행하지 못하는 IISExpress - 두 번째 이야기
13541정성태1/29/20249601VS.NET IDE: 188. launchSettings.json의 useSSL 옵션
1  2  3  4  5  6  7  8  9  10  11  12  13  14  [15]  ...