2011-09-27 3 views
2

질문Visual Studio 설치 프로젝트의 "탐지 된 종속성"기능을 복제하는 방법은 무엇입니까?

(재귀 적으로) 주어진 비주얼 스튜디오 프로젝트 파일의 모든 종속성을 감지 통조림 솔루션이 있습니까? 이것은 기본적으로 Visual Studio 설치 프로젝트의 "탐지 된 종속성"기능이하는 일이지만, (MSBuild에서 이상적으로) 의존성 목록에 프로그래밍 방식으로 액세스해야합니다.

배경 (당신은 내가 해결하기 위해 노력하고있어 실제 문제에 대해 알고 싶다면 읽기)

나는 타사 UI 라이브러리를 활용하는 윈폼 응용 프로그램에 대한 자동화 된 빌드 작업입니다. 응용 프로그램을 성공적으로 빌드하려면 라이브러리를 build/dev 컴퓨터에 "설치"해야합니다 (이는 어셈블리를 GAC에두고 라이센스 구성 요소를 설치 함). 공급 업체의 dll은 프로젝트 파일의 GAC를 통해 참조되어야합니다. 불행하게도이 "설치"요구 사항을 피할 수있는 방법은 없습니다. (소스 제어 시스템에서 가져온 로컬 참조를 사용하고 싶습니다. 다른 제 3 자 참조와 거의 비슷하지만이 방법은 불가능합니다. 케이스).

"플러그인"아키텍처를 사용하므로 실행 가능 프로젝트는 이러한 구성 요소를 직접 참조하지 않으며 "실행 가능 프로젝트"에서 참조되는 "플러그인"프로젝트를 통해 모두 간접적으로 참조됩니다. 따라서 "plugin"프로젝트에서 GAC 참조를 "copy local = true"로 설정하면 공급 업체 dll을 플러그인 프로젝트의 출력 디렉토리로 복사 만합니다. 그들은 실행 가능 프로젝트의 출력 디렉토리에 재귀 적으로 복사되지 않습니다. 따라서 실행 디렉터리의 xcopy 배포는 이러한 공급 업체 dll이 설치되지 않은 컴퓨터에서는 출력 디렉터리에 없기 때문에 작동하지 않습니다.

우리는 현재 Visual Studio 설치 프로젝트를 통해 msi 배포를 사용하며 xcopy 배포로 전환하려고합니다. 종속성은 설치 프로젝트의 "탐지 된 종속성"기능 내에서 발생하는 모든 마술에 의해 "탐지"되기 때문에 공급 업체 DLL은 현재 msi에 패키지됩니다. xcopy 배포 작업을 수행하기위한 내 솔루션은 "copy local"이 true로 설정된 참조 된 플러그인에서 사용되는 공급 업체 DLL을 실행 가능 프로젝트가 직접 참조하도록 요구하는 것입니다. 필요한 모든 벤더 dll이이 방식으로 참조되었는지 확인하려면 실행 가능 프로젝트의 "탐지 된 종속성"목록을 생성하고 해당 종속성이 실행 가능 프로젝트의 출력 디렉토리에 존재하는지 확인한 다음 빌드를 실패합니다 그들이 모두 존재하지 않는다면.

csproj 파일을 분석하고 모든 "참조"항목 목록을 컴파일하고 프로젝트 참조 다음에 반복적으로 컴파일하여이 작업을 직접 수행 할 수 있습니다. 그러나 "탐지 된 종속성"이 프레임 워크 DLL을 필터링 할만큼 똑똑하지만 GAC 참조 된 공급 업체 DLL을 포함한다는 점을 감안할 때 어딘가에 통조림 기능이 있기를 기대합니다.

감사합니다.

답변

0

아마도 Reflection을 사용하여이 문제를 해결할 수 있습니다. 플러그인과 호스트는 공통 인터페이스 계약을 맺을 가능성이 큽니다. 코드는 빌드 된 후에 알려진 인터페이스 계약 집합을 사용하기 위해 모든 어셈블리를 검색하고 이러한 요소를 IDE 확장 성 자동화를 통해 설치 프로그램 프로젝트에 추가/업데이트합니다. 이 새로 고침을 수동으로 수행하는 플러그인을 작성하는 것이 하나의 옵션 일 수 있습니다. MSBuild 태스크를 작성하고 등록하는 것이 더 좋습니다.

나는 이것이 '준비된 해결책'이 아니라는 것을 알고 있지만, 필요한 노동량은 하나의 KLOC 미만이어야합니다.

+0

죄송합니다 - 아마도 명확하지 않았습니다. 나는 설치자 프로젝트의 생성을 자동화하려고하지 않는다.설치 프로그램을 제거하고 xcopy 기반 배포로 이동하려고합니다. 그러나 GAC 참조 어셈블리가 내 응용 프로그램의 출력 디렉터리로 복사되도록하는 것은 어렵습니다. 그게 제가 해결하려고하는 문제입니다 (출력물에 복사해야하는 어셈블리를 파악하십시오). –

+0

이제 알겠습니다 (희망). 이 DLL을 솔루션 내의 폴더 (솔루션 항목 폴더 추가)에 복사하고 체크하고 _content_ deployment를 사용하여 주 프로젝트에 _links_로 추가하십시오. 이는 관리되지 않는 DLL에서도 작동합니다. – aquaherd

관련 문제