통합검색
· 마을서비스란?  · 포럼마을  · 일반마을  · 테마마을  · 마을랭킹  · 활동왕
· 덱스퍼트란?  · TECBOX   · PRSBOX   · 이용안내  
· DEXT제품군  · 솔루션베이  · S/W & ESD 컴포넌트
· 프로그램베이
· LiveSeminar  · LiveConference
Visual C++ 포럼마을 입니다.
  마을등급 Visual C++   이 마을은 포럼마을 입니다이 마을은 자유가입제 마을 입니다 마을소개 페이지로 이동 전입신청
마을촌장촌장 나성훈 주민 34036 since 2006-12-29
우리마을 공지사항
질문&답변
강좌&팁
자유게시판
자료실
앨범
개인게시판
마을 게시판
등록된 마을 게시판이
없습니다.
랑데브 게시판
칼럼 게시판
개발자 고충상담
Dev Talk
자유토론방
벼룩시장
재나미 우스개
구인/프로젝트 정보
사람인 채용 게시판
  고객지원 게시판
마이 데브피아
 나의 e-Money 내역
 활동왕 My Page
 스크랩한 게시글보기
 쪽지관리
 주소록관리

 강좌&팁
 NuGet을 이용한 네이티브 패키지 관리   | VC++ 일반 2017-03-15 오후 8:50:01
 kyh2984@hotmail.com  kyh2984@hotmail.com님께 메시지 보내기kyh2984@hotmail.com님을 내 주소록에 추가합니다.kyh2984@hotmail.com님의 개인게시판 가기 번호: 8872 추천:0  / 읽음:4,265

오픈소스를 공짜 소스 혹은 공짜 라이브러리라고만 생각하다면 오픈소스를 반만 활용하고 있는 것이다. 단순히 소스코드나 바이너리로써 오픈소스의 결과물만을 사용만한다면 추후 오픈소스의 구 버전에 종속되어 있는 프로젝트 결과물을 얻거나, 최신 버전의오픈소스 적용을 위하여 프로젝트의 많은 코드 변경을 필요로 할 수 있다. 이러한 단점 보다 더 큰 불익은 오픈소스의 장점을 프로젝트에 하나도 녹여내지 못한다는 것이다. 프로젝트에 포함되어 있는 모듈의 한 부분을 오픈소스화 하거나 기존 오픈소스를 프로젝트에 도입하여 전 세계 개발자들과 공동으로 개발하면서 프로젝트를 진행해 프로젝트의 성능과 기능을 함께 향상 시키고 문제를 해결하는 기회를 스스로 포기하는 셈이기 때문이다.

 

마이크로소프트의 지지 속에 아우터커브(Outercurve)는 NuGet을 발표 하면서 개발자들이 편리하게 사용할 수 있는 오픈소스를 제공하는 것 뿐만 아니라 소스코드 저장소(Source code Repository)와 커뮤니티, 비주얼 스튜디오와 연결된 오픈소스 접근 툴, 온라인/오프라인 컨퍼런스등을 토털 셋으로 제공하면서 오픈소스를 쉽고 간편하게 프로젝트에 활용할 수 있는 에코시스템을 갖추었다.

 

 

 

NuGet 살펴보기

 

오픈소스를 이용하기 위해서는 일반적으로 소스포지(http://sourceforge.net)와 같은 공개된 소스 저장소에서 원하는 프로젝트를찾거나 코드프로젝트(http://www.codeproject.com), 스택오버플로(http://stackoverflow.com)에서 원하는 기능의 오픈소스에 대한정보를 얻어 오픈소스를 다운로드 한 뒤, 프로젝트에 맞게 설정 정보를 변경하여 적용한 후 오픈소스의 기능을 이용한다. NuGet은이 과정속의 많은 부분을 편리하게 이용할 수 있는 기능을 제공해 준다.

 

NuGet 갤러리(http://www.nuget.org) 에는 2013년 8월 현재 15000여개의 프로젝트가 11만 6천여개의 프로젝트 패키지로 관리되어 있으며 하루 평균 약 23만건 정도의 프로젝트 다운로드가 발생하고 있다.

 

 

<화면 1> NuGet 갤러리에서 원하는 패키지를 찾을 수 있다

 

 

 

NuGet의 구성은 크게 소스코드 저장소와 클라이언트로 나눌 수 있다. NuGet은 인터넷에 공개된 소스코드 저장소를 NuGet 갤러리로 제공해 주고 있다. 개발자는 별도의 서버를 마련할 필요 없이 소스코드를 NuGet 갤러리에 업로드 함으로 써, NuGet갤러리가제공해 주는 다양한 기능을 제공받을 수 있고 쉽게 전 세계 개발자들에게 소스 코드를 공개할 수 있다. 공개된 소스 코드는 비주얼스튜디오 확장을 통해 빠르게 접근할 수 있으며 NuGet 패키지 관리자 및 파워쉘 커맨드를 통해 쉽게 관리할 수 있다.

 

NuGet은 하나의 프로젝트와 관련된 라이브러리, 소스코드, 툴, 예제파일, 샘플 등을 취합해 패키지 단위로 관리 한다. 관리 단위 또한 패키지 버전 단위로 관리 되는데, 패키지는 .nupkg 확장자를 가지고 있으며, 꼭 소스코드의 변경 단위가 아닌 패키지 중 어느 한가지만 변경되었다고 할지라도 다른 패키지로 관리 할 수 있다. NuGet 갤러리에서 검색되어 다운로드 되고 설치, 업데이트 되는단위 또한 패키지다.

 

패키지가 설치되면 패키지의 구성 요소들은 버전 관리가 이루어 진다. 새 패키지 버전이 나왔다면 해당 소스 코드나 DLL가 같은라이브러리뿐만 아니라 샘플, 도움말등 패키지 구성요소들이 한꺼번에 업데이트 되고 더해지거나 삭제되기도 한다. 구 버전의 패키지는 NuGet 갤러리에서 다운로드 할 수 있다. 비주얼 스튜디오에서 프로젝트에 패키지를 적용하게 되면 프로젝트 설정파일을자동으로 설정해 준다. 예를 들어 닷넷 프로젝트의 경우 패키지에 따라 web.config파일이나 app.config에 레퍼런스를 자동으로 관리해 주는데 패키지를 설치할 경우 추가해 주고, 패키지를 제거할 경우 자동으로 해당 부분을 삭제해 준다.

 

C++ 프로젝트에서 오픈소스를 사용 할 때, 오픈 소스 include 폴더와 라이브러리 폴더를 프로젝트에 설정해 주었으나, NuGet 패키지를 설치하면 이러한 설정 사항을 패키지가 자동으로 설정해 주며 추가적으로 해당 패키지와 종속된 다른 패키지들도 자동으로 설치한다. 설정된 외부 소스 코드를 프로젝트에서 걷어 낼 때도 간편하다. 설치된 패키지를 언인스톨 하면 설치된 오픈소스의패키지 구성요소와 함께 자동으로 설정되었던 경로 및 프로젝트 설정들에서 해당 오픈소스에 관련된 부분이 완전히 삭제된다.

 

 

<화면 2> nuget 프로젝트 자체도 오픈소스(http://nuget.codeplex.com/)로 운영된다.

 

 

 

소스 저장소를 임의의 서버로 운영하거나 패키지를 로컬에 두는 것도 가능하다. NuGet은 서버와 클라이언트간에 패키지 교환시발생하는 프로토콜에 대해 공개하고 있으므로 임의의 NuGet 소스 저장소를 운영하는 것이 가능하고 NuGet 갤러리를 포함한 다수의 소스 저장소를 동시에 검색하고 사용하는 것 또한 가능하다.

 

만일 번거로운 설정 없이 약간의 비용을 지불하여 독립된 온라인 NuGet 소스 코드 저장소를 생성하고 싶다면 아래와 같은 상용서비스를 이용할 수도 있다.

 

 

 

MyGET : http://www.myget.org

 

Inedo ProGet : http://inedo.com/proget/overview

 

Nexus : http://www.sonatype.com/nexus/nexus-pro-features

 

Artifactory : http://www.jfrog.com/home/v_artifactorypro_features

 

 

<화면 3> 온라인 NuGet 저장소 서비스인 MyGET

 

 

 

이미 인터넷에는 공식적인 중앙 공개 소스코드 저장소인 NuGet 갤러리와 같이 검색을 통해 접근할 수 있는 NuGet 저장소가 운영되고 있다. 추가적인 NuGet 저장소를 설정하는 법 또한 간단한데, TOOL > Options > Package Manager > Package Sources에 NuGet 저장소의 이름과 공개하고 있는 xml의 URL을 입력하면 된다. 로컬에 있는 폴더 또한 NuGet 저장소로 사용할 수 있는데, 임의의 폴더에 NuGet 패키지 파일을 저장해 놓고 해당 경로는 Sources 에 입력하면 자주 사용하는 패키지를 빠르고 인터넷이 안되는 상황에서도 NuGet 패키지를 접근할 수 있다. <화면 4>는 특정 로컬 폴더를 NuGet 저장소로 지정한 예를 보여주고 있다.

 

 

 

 

 

<화면 4> 로컬에 패키지 파일을 두고 NuGet 패키지 저장소처럼 사용할 수 있다.

 

 

 

NuGET의 설정내용은 아래의 NuGet 설정파일에서 관리하고 있다.

 

 

 

%appdata%\NuGet\NuGet.Config

 

 

 

NuGet.Config 파일은 <리스트 1>에서 보듯 설정한 NuGet 저장소 정보와 해당 저장소의 사용 유무등의 정보를 가지고 있는데, 모든 비주얼 스튜디오의 NuGet 패키지 관리자는 같은 경로의 NuGet 설정파일을 참고하므로 다수의 비주얼 스튜디오를 하나의 개발머신에 설치 했을 때 한가지 버전의 비주얼 스튜디오만 설정을 변경하더라도 변경내용은 설치된 모든 비주얼 스튜디오에 영향을미친다. 그리고, 항상 해당 NuGet 설정파일 경로를 참고하므로 개발머신을 재 설치 할 때, 해당 파일을 백업하여 관리한다면 NuGet 저장소에 일일이 추가하는 수고를 덜 수 있을 것이다.

 

 

 

<리스트 1> NuGet.Config 파일의 예

 

<?xml version="1.0" encoding="utf-8"?>

 

<configuration>

 

//...

 

<packageSources>

 

<add key="NuGet official package source" value="https://nuget.org/api/v2/" />

 

<add key="Local NuGet Repository" value="C:\work\LocalNuGetRepository" />

 

</packageSources>

 

//...

 

</configuration>

 

 

 

NuGet 사용을 위한 준비

 

비주얼 스튜디오는 다른 개발 플랫폼과 차별성있고 완성도 높은 개발자의 편의성을 제공해 주고 있다. NuGet역시 비주얼 스튜디오에 맞는 편리한 도구를 제공해 주고 있으며, 파워 쉘의 커맨드 라인을 통해 세밀한 제어를 할 수 있도록 하고 있다. NuGet은 파워쉘 2.0 버전 이상을 이용하기 때문에 Windows XP 서비스팩3 이상, 비스타 서비스팩1 이상의 환경이 필요하다. 하지만 C++에서 NuGet을 사용할 경우 파워쉘 3.0 버전 이상을 설치할 것을 권장한다. 비주얼 스튜디오를 통한 확장을 사용하기 위해선 비주얼 스튜디오 2010 이상의 버전이 필요하다. 비주얼 스튜디오 2012 버전 이상을 사용하고 있다면 기본적으로 NuGet 확장이 설치되어 있다. 비주얼 스튜디오 2010 버전이나 비주얼 스튜디오 2012 이상의 버전이라고 할 지라도 TFS 버전과 같은 NuGet 확장이 설치되어이지 않다면 아래의 경로에서 NuGet 자신의 비주얼 스튜디오 버전에 맞는 확장을 설치하도록 한다. 아래 링크에는 비주얼 스튜디오 2010, 2012, 2013에서 동작하는 비주얼 스튜디오 확장을 설치할 수 있는 비주얼 스튜디오 갤러리의 링크를 얻거나 웹매트릭스(WebMatrix) 및 커맨드라인 유틸리티를 다운로드 받아 NuGet 패키지 매니저등을 설치하거나 업데이트 할 수 있다.

 

 

 

http://docs.nuget.org/docs/start-here/installing-nuget

 

 

 

비주얼 스튜디오는 비주얼 스튜디오 확장의 관리를 UI에서 할 수 있도록 확장 관리자(Extension Manager) 제공해 주는데 이를 통해 NuGet 패키지 관리자를 설치할 수도 있는데, TOOLS > 확장 관리자(Extension Manager) 혹은 확장 및 업데이트(Extensions and Updates)를 선택하고 nuget을 검색하면 NuGet Package Manager를 설치할 수 있다.

 

 

<화면 5> 확장 관리자에서 nuget을 검색하여 NuGet Package Manager의 버전을 확인하거나 설치할 수 있다.

 

 

 

C++에서 NuGet을 사용하기 위해선 NuGet 2.5버전 이상이 필요하다. 최근 비주얼 스튜디오 2013 경우 <화면 5>와 같이 2.5 버전이상의 NuGet 패키지 관리자가 설치되어 있기 때문에 비주얼 스튜디오만 설치하더라도 C++언어에서 기본적으로 NuGet을 사용할 수 있는 상태이지만 비주얼 스튜디오 2012 이하 버전의 경우 NuGet 패키지 관리자를 설차히거나 업데이트 시켜주어야 한다. 예를 들어 비주얼 스튜디오 2012의 경우 <화면 6>와 같이 2.5 이하 버전이 설치되어 있으므로 NuGet 패키지 매니저를 업데이트시켜주어야 한다.

 

 

<화면 6> 비주얼 스튜디오 2012이하 버전은 NuGet 패키지 관리자를 업데이트 해야 한다.

 

 

 

비주얼 스튜디오 2008의 경우 정식으로 NuGet 확장을 제공해 주지는 않고 있다. 하지만 커맨드 라인에서 nuget.exe를 통하여 NuGet 기능을 이용하는 매크로를 만들어 우회적으로 사용할 수 있다. 비주얼 스튜디오 2010 이상의 버전에서 동작하는 확장 또한 nuget.exe나 파워쉘을 통한 기능에 UI를 입힌 것 뿐이니 nuget.exe를 이용한 매크로와 NuGet 확장은 NuGet 패키지 관리자를 이용한 NuGet 패키지 관리기능과 유사하게 이용할 수 있다. nuget.exe는 아래의 경로에서 구할 수 있다.

 

 

 

https://nuget.org/nuget.exe

 

 

 

네이티브 프로젝트에서의 NuGet

 

NuGet 패키지 매니저를 설치하면 C++ 프로젝트를 지원하는 NuGet이라면 솔루션 탐색기(Solution Explorer)에서 프로젝트의 컨텍스트 메뉴에 NuGet관련 항목, TOOLS > Library Package Manager 메뉴 항목, View > Other Windows > Package Manager Console 메뉴 항목, TOOLS > Option > Package Manager 항목 등이 생성되어 이를 활용해 NuGet 기능을 이용할 수 있다.

 

네이티브 C++ 프로젝트는 .NET을 이용하지 않기 때문에 다른 언어들과 설정을 공유하지 않는 옵션이 많을 뿐만 아니라 대상 타겟에 따라 데스크탑/윈도우 스토어 앱, Debug/Relese, x86/x64, 정적라이브러리/동적라이브러리, 멀티스레드지원/단일스레드지원 등다양한 컴파일 옵션에 따른 바이너리를 갖추어야 하고, 따라서 비주얼 스튜디오가 지원하는 다른 언어에 비해 라이브러리를 배포하고 구성하는 것이 복잡한 편이다. 같은 헤더 파일을 포함하는 방법 이라고 할지라도 솔루션 전역적인 방법, 프로젝트 지역적인방법, 소스코드 내에 기술하는 방법 등 프로젝트의 상황에 따라 다양한 방법으로 유연하게 적용하여 동일한 효과를 낼 수 있는 옵션들이 많다는 것도 생각해봐야 될 문제이다.

 

 

 

<화면 7> NuGet 패키지가 설치된 경로

 

 

 

NuGet 패키지는 프로젝트 단위로 적용되며 NuGet파일은 솔루션 파일과 동일한 경로에 packages 폴더가 생성되어 설치된다. packages 폴더 안쪽에는 패키지 설정 파일과 함께 설치한 패키지 별로 폴더가 만들어 지며 패키지별 폴더 안쪽에는 다운로드 받은패키지 파일과 패키지별 파일들이 물리적으로 위치해 있다.

 

기존에 오픈소스를 이용할 때는 오픈소스 파일을 다운로드 받고 컴파일 한 후, 오픈소스에 포함되어 있는 include 경로와 빌드한라이브러리 경로를 프로젝트 설정에 반영해 주고 라이브러리를 이용한 반면, NuGet 패키지 매니저를 통해 패키지 파일을 설치하면 해당 라이브러리를 바로 사용할 수 있다. 프로젝트가 Debug/Release 모드 인지, 멀티스레드용인지 단일 스레드용인지, x86/x64인지 등 각 상황별로 반복적인 오픈소스 라이브러리의 설정 작업과 빌드 작업을 NuGet 패키지가 자동으로 해주기 때문이다. 기존오픈소스를 사용할 때마다 이러한 반복적이고 지루한 작업을 필수적이라 생각하고 작업이라 생각했던 개발자들에게는 마법과 같이 느껴질 수도 있을 만큼 간단하다.

 

가령 프로젝트에서 파일 압축 기능을 사용하기 위해 zlib를 정적 라이브러리로 사용하려고 한다면 먼저 검색 엔진을 통해http://www.zlib.net 을 접속하여 소스 코드를 다운로드 받을 것이다. 그리고 프로젝트와 동일한 비주얼 스튜디오버전에서 프로젝트 타입과 같이 zlib 프로젝트를 정적 라이브러리로 설정하고 몇 차례의 시행착오를 거처 라이브러리를 빌드한 후 대상 프로젝트의프로젝트 옵션에 zlib의 정적 라이브러리 관련 내용을 추가해 줄 것이다. 만일 프로젝트를 진행하다가 개발 툴이 변경되거나 적용플랫폼이 x64로 확장되기라도 한다면 위의 과정을 다시금 반복하는 경우가 빈번하다. 특히 오픈 소스 라이브러리가 또 다른 오픈소스들에 종속되어진 경우 반복횟수는 몇 곱절이 될 수도 있다.

 

zlib를 NuGet 패키지 관리자를 통해 설치하면 프로젝트의 솔루션 파일 하위 경로에서 아래의 패키지 파일을 확인할 수 있다.

 

 

 

솔루션 파일의 경로\packages\zlib.1.2.8.6\zlib.1.2.8.6.nupkg

 

 

 

패키지 파일은 앞서 언급한 것과 같이 라이브러리, 헤더파일, 도구, 설정파일 및 예제파일등 라이브러리에 관련된 모든 사항들이담겨 있다. 그리고 아래 경로에서 MSBuild 설정 파일을 확인할 수 있다.

 

 

 

솔루션 파일의 경로\packages\zlib.1.2.8.6\build\native\zlib.targets

 

 

 

해당 MSBuild파일은 NuGet 패키지는 zlib에 대한 include 경로를 비롯한 다양한 설정과 프로젝트에 맞는 플랫폼과 옵션에 따른 올바른 라이브러리에 대한 경로를 기술하고 있는데, 컴파일 설정 MSBuild에 대한 여러 사항들을 설정해 주어 프로젝트 컴파일시 패키지의 올바른 라이브러리가 적용된 대상 바이너리를 생성해 낸다. 기본으로 제공해 주는 패키지 이외의 타겟에 필요한 바이너리가 필요하다면 이 설정사항을 변경해 예를 들어 .NET4나 .NET45등의 타겟들을 추가할 수도 있다.

 

이미 C++개발자들에게 익숙한 많은 라이브러리들이 NuGet 갤러리에 포함되어 있다. 대표적으로 ZLib, OpenCV, libjpeg, PCRE(Perl Compatible Regular Expressions), cURL, lua, libtiff, freeglut, libxml2, glib, DirectX Tool Kit, Expat XML Parser, libpng, libssh2, libiconv, C++ REST SDK, BZip, OpenSSL등 상용 프로젝트에 필수적으로 사용되는 많은 오픈소스들이 이미 준비되어 있으며 나만의 라이브러리의 패키지를 만들어 프로젝트 맴버들에게 배포하거나 전세계 개발자들에게 공유할 수도 있다.

 

만일 프로젝트에서 패키지로 설치한 라이브러리를 걷어 내려 한다면 NuGet 패키지 관리자에서 해당 패키지의 언인스톨을 실행하면 된다. 단순히 언인스톨을 클릭하는 것만으로 프로젝트에서 라이브러리에 대한 설정을 깨끗하게 걷어낼 수 있다.

 

TOOLS > Options > Package Manager > General에는 빠진 패키지가 있다면 빌드시 해당 패키지를 자동으로 다운로드해 빌드 과정을 수행하는 옵션이 있으므로 눈여겨 보고 넘어가도록 하자.

 

 

<화면 8> 빌드 시 없는 패키지를 자동으로 다운로드 받는 옵션

 

 

 

만일 비주얼 스튜디오가 설치되지 않고 MSBuild를 이용해 빌드만 하는 빌드머신의 경우에는 EnableNuGetPackageRestore를 환경변수로 만들고 true로 설정한다.

 

 

 

NuGet 이용한 라이브러리 사용

 

NuGet에 대한 기본적인 설정 및 배경에 대해 알아보았으니 NuGet을 이용해 라이브러리를 간편하게 사용해 보도록 하자. 먼저 콘솔 프로젝트를 만들고 NuGet 패키지 관리자를 통해 cpprestsdk를 검색하여 설치한다.

 

 

 

<화면 9> NuGet 패키지 관리자를 이용한 C++ REST SDK 라이브러리 설치

 

 

 

C++ REST SDK는 모던한 C++문법을 이용해 REST 및 여러 프로토콜을 이용한 클라우드 서버/클라이언트 애플리케이션을 쉽게 만들 수 있는 라이브러리로, 다중 플랫폼을 지원하는 오픈소스다. C++ REST SDK에 대한 자세한 내용은 2013년 마이크로소프트웨어 6, 7월호 ‘C++ REST SDK, 카사블랑카 튜토리얼’을 참고하자. 설치하는 과정에서 라이선스 관련 동의를 하면 <화면 9>와 같이 C++ REST SDK가 설치되는 안내 창을 볼 수 있다.

 

C++ REST SDK의 경우 재배포 패키지를 제외한 종속 라이브러리가 없지만, 종속된 관계의 다른 라이브러리가 있는 경우 함께 설치가 되기 때문에 프로젝트에 필요한 라이브러리만 검색해 설치하면 다른 부가적인 환경은 NuGet이 알아서 만들어 준다.

 

C++ REST SDK의 패키지 설치가 완료되었다면 <리스트 2>의 코드를 작성하고 실행한다. 콘솔화면에 가득히 html 내용이 나온다면 정확한 결과가 나온 것이다.

 

 

 

<리스트 2> C++ REST SDK를 이용한 http 클라이언트의 예

 

#include <windows.h>

 

#include <iostream>

 

#include <cpprest/http_client.h>

 

int _tmain(int argc, _TCHAR* argv[]) {

 

    std::wcout.imbue(std::locale("kor"));

 

    web::http::client::http_client client(L"http://www.naver.com/index.html");

 

    utility::string_t response =

 

        client.request(web::http::methods::GET).get().extract_string().get();

 

    std::wcout << response.c_str() << std::endl;

 

    return 0;

 

}

 

 

 

우리는 <리스트 2> 코드를 설치할 때 cpprest/http_client.h의 include를 위한 프로젝트 속성의 include 경로 추가나 프로젝트에서 lib 경로를 인식하기 위해 프로젝트 속성에 lib 경로 추가 및 #pragma 전처리 지시자등을 입력하지 않고도 C++ REST SDK를 기본라이브러리 사용하듯 간편하고 편리하게 사용할 수 있었다.

 

 

 

커맨드라인을 이용한 NuGet 사용

 

NuGet 패키지 관리자를 사용한다면 라이브러리를 설치하고 사용만 하는데는 큰 불편함이 없을 것이다. 하지만 NuGet 패키지에대한 세밀한 제어를 하기 위해서는 패키지 관리자 콘솔(Package Manager Console)을 이용한 작업이 필수적이다.

 

패키지 관리자 콘솔 윈도우는 메뉴의 TOOLS > Library Package Manager > Package Manager Console 혹은 View > Other Windows > Package Manager Console를 통해 열 수 있다.

 

패키지 관리자 콘솔 윈도우는 원천 패키지 경로를 선택할 수 있는 Package source 항목과 환경설정 버튼, 적용되는 프로젝트 그리고 파워쉘 명령어를 입력할 수 있는 콘솔 윈도우로 구성되어 있다.

 

 

<화면 10> 패키지 관리자 콘솔 윈도우

 

 

 

지정된 NuGet 저장소에 패키지를 검색하기 위해서는 Get-Package 명령어를 사용한다. -Filter등의 옵션은 원하는 패키지를 검색하는데 도움을 준다. -ListAvailable 옵션을 사용하지 않으면 프로젝트에 적용된 패키지의 리스트를 조회한다.

 

 

 

<리스트 3> Get-Package를 사용해 설치할 수 있는 라이브러리를 검색하는 예

 

PM> Get-Package -ListAvailable -Filter cpp

 

Id Version Description/Release Notes

 

-- ------- -------------------------

 

cpprestsdk 1.1.0.1 This library is a Microsof...

 

cpprestsdk.redist 1.1.0 Redistributable components...

 

cpplinq 2013.08.10 cpplinq is an open-source ...

 

pugg 0.6 Features : Auto loading of...

 

tinyxml2 1.0.11 There are different ways t...

 

 

 

설치할 패키지를 검색했다면 Install-Package 명령어를 이용해 패키지를 설치할 수 있다. -Verbose와 같은 옵션을 사용하면 인스톨과정에 대한 상세한 동작을 살펴볼 수 있다.

 

 

 

<리스트 4> Install-Package 명령어를 이용한 패키지 설치

 

PM> Install-Package cpprestsdk -Verbose

 

Attempting to resolve dependency 'cpprestsdk.redist (≥ 1.1.0)'.

 

Installing 'cpprestsdk 1.1.0.1'.

 

You are downloading cpprestsdk from casablancacore, the license agreement to which is available athttp://www.apache.org/licenses/LICENSE-2.0. Check the package for additional dependencies, which may come with their own license agreement(s). Your use of the package and dependencies constitutes your acceptance of their license agreements. If you do not accept the license agreement(s), then delete the relevant components from your device.

 

Added file 'configurations.autopkg' to folder 'cpprestsdk.1.1.0.1\build'.

 

.. 중략

 

Added file 'cpprestsdk.1.1.0.1.nupkg' to folder 'cpprestsdk.1.1.0.1'.

 

Successfully installed 'cpprestsdk 1.1.0.1'.

 

Adding 'cpprestsdk 1.1.0.1' to cppTest.

 

Added file 'packages.config'.

 

Successfully added 'cpprestsdk 1.1.0.1' to cppTest.

 

 

 

패키지 관리자 콘솔에서 사용할 수 있는 명령어 목록은 <표 1>에 정리되어 있다.

 

 

 

<표 1> 패키지 관리자 콘솔에서 사용하는 명령어 목록

 

명령어

사용법

설명

Get-Help

 

도움말 조회

Get-Package

Get-Package -Source <string> [-ListAvailable] [-Updates] [-ProjectName] [-Filter <string>] [-First <int>] [-Skip <int>] [-AllVersions]

패키지 목록 얻기

Install-Package

Install-Package [-Id] <string> [-IgnoreDependencies] [-ProjectName <string>] [-Version <string>] [-Source <string>] [-FileConflictAction]

패키지 설치

Uninstall-Package

Uninstall-Package [-Id] <string> [-RemoveDependencies] [-Force] [-Version <string>]

패키지 언인스톨

Update-Package

Update-Package [-Id] <string> [-IgnoreDependencies] [-ProjectName <string>] [-Version <string>] [-Source <string>] [-Safe] [-FileConflictAction]

패키지 업데이트

Add-BindingRedirect

Add-BindingRedirect [-ProjectName] <string>

설정파일에 바인딩 리다이렉션 추가

Get-Project

Get-Project [[-Name] <string>] [-All]

프로젝트 지정

Open-PackagePage

Open-PackagePage -Id <string> [-Version] [-Source] [-License] [-ReportAbuse] [-PassThru]

패키지의 홈페이지 접속

Register-TabExpansion

Register-TabExpansion <string> <string>...

인텔리센스와 같은 탭확장에 명령어를 등록

 

 

 

공통 옵션은 -Verbose, -Debug, -WarningAction, -WarningVariable, -ErrorAction, -ErrorVariable, -OutVariable, -OutBuffer, -WhatIf, -Confirm를 제공하며 자세한 사용법은 패키지 관리 콘솔의 도움말을 이용한다.

 

 

 

네이티브 NuGet 패키지 만들기

 

이제 마지막으로 프로젝트를 NuGet 패키지로 만드는 방법을 살펴보도록 하자. C++ 프로젝트를 NuGet 패키지로 만들기 위해서 CoApp 파워쉘 툴을 사용하는데, 이를 설치하기 위해 파워쉘 3.0 이상의 버전이 필요하다.

 

파워쉘 3.0 버전 설치가 필요하다면 아래의 링크에서 Windows Management Framework 3.0을 설치한다.

 

 

 

http://www.microsoft.com/en-us/download/details.aspx?id=34595

 

 

 

CoApp 파워쉘 툴 설치를 위해 아래의 파일을 실행한다.

 

 

 

http://downloads.coapp.org/files/CoApp.Tools.Powershell.msi

 

 

 

네이티브 NuGet 패키지를 만들기 위해 CSS와 비슷하게 간단한 문법을 가진 오토 패키지(Auto-package) 스크립트를 이용할 것이며 오토 패키지 스크립트는 확장자가 .autopkg로된 텍스트 파일이다.

 

 

 

<리스트 5> 오토 패키지 파일의 예

 

nuget {

 

nuspec {

 

id = SimpleHTTPClient;

 

version : 0.0.0.1;

 

title : Simple HTTP Client Static Module;

 

authors : Jason Kim;

 

owners : {Native NuGet Package Exam};

 

requireLicenseAcceptance : false;

 

tags : {HTTP, native, SimpleHTTPClient};

 

}

 

files {

 

include: {SimpleHTTPClient\*.h};

 

[x86,v110,debug,desktop] {lib : {Debug\SimpleHTTPClient.lib};}

 

[x86,v110,release,desktop] {lib : {Release\SimpleHTTPClient.lib};}

 

}

 

}

 

 

 

지금까지 살펴 본 NuGet은 그동안 빌드 했던 오픈소스 라이브러리를 다시 빌드하고 프로젝트마다 include 및 라이브러리 경로를설정해야 했던 개발자들에게 커다란 선물을 준 것처럼 보일 수 있다. 그러나 은총알은 없다는 말처럼 편리하다는 것은 어디선가 그작업을 대신 해 준다는 의미라는 것을 <리스트 6>을 통해 알 수 있을 것이다. NuGet 패키지를 설치 하는 예상 환경의 바이너리를마련해 놓고 각각의 lib, dll, pdb파일의 경로와 include 파일의 경로를 설정해 준다. 오토 패키지 스크립트에 대한 설명은 제한된지면으로 인해 참고자료의 링크로 대신한다.

 

만들어진 오토 패키지 스크립트는 NuGet 패키지 콘솔 윈도우에서 <리스트 6>과 같이 실행한다.

 

 

 

<리스트 6> Write-NuGetPackage 명령어를 이용한 NuGet 패키지 작성

 

PM> Write-NuGetPackage .\SimpleHTTPClient.autopkg

 

 

 

참고자료

1. NuGet 문서 - http://docs.nuget.org/

2. An Overview of the NuGet Ecosystem -

http://www.codeproject.com/Reference/628210/An-Overview-of-the-NuGet-Ecosystem

3. Pro NuGet 저자 Xavier Decoster 블로그 - http://www.xavierdecoster.com/

4. Slides & code of MSDN Live Meeting: CI using TFS11 & NuGet - http://www.xavierdecoster.com/post/2012/05/08/slides-code-of-msdn-live-meeting-ci-using-tfs11-nuget-aspx

5. Support for Native Projects - http://blog.nuget.org/20130426/native-support.html

6. NuGet for C++ - http://blogs.msdn.com/b/vcblog/archive/2013/04/26/nuget-for-c.aspx

7. Deep Dive into NuGet Native (Part One) - http://blogs.msdn.com/b/vcblog/archive/2013/06/18/deep-dive-into-nuget-native-part-one.aspx

8. CoApp - http://coapp.org/index.html

9. CoApp를 이용한 네이티브 패키징 - https://github.com/coapp/coapp.org/blob/master/src/dynamic/tutorials/building-a-package.html.md

 

 

 

[코멘트] 좋음
2017-04-03 13:10
 dacaijo  dacaijo님께 메시지 보내기dacaijo님을 내 주소록에 추가합니다.dacaijo님의 개인게시판 가기 
이미지가 안보여요 ㅜ,.ㅜ
저장 취소
코멘트쓰기
  좋음   놀람   궁금   화남   슬픔   최고   침묵   시무룩   부끄럼   난감
* 코멘트는 500자 이내(띄어쓰기 포함)로 적어주세요.
목록 보기   지금 보고 계시는 글을 회원님의 my Mblog >> 스크랩에 넣어두고 다음에 바로 보실 수 있습니다.  
회사소개  |   개인정보취급방침  |  제휴문의  |   광고문의  |   E-Mail 무단수집거부  |   고객지원  |   이용안내  |   세금계산서
사업자등록번호 안내: 220-81-90008 / 통신판매업신고번호 제 2017-서울구로-0055호 / 대표: 홍영준, 서민호
08390, 서울시 구로구 디지털로32길 30, 1211호 / TEL. 02_6719_6200 / FAX. 02-6499-1910
Copyright ⓒ (주) 데브피아. All rights reserved.