1

내 부서에서 사용할 수 있도록 Visual Studio에서 템플릿 프로젝트를 구성하고 있습니다. 프로젝트는 TFS의 다른 곳에 저장된 몇 가지 공통 라이브러리를 참조해야합니다. 문제는 템플릿이 다양한 위치에서 사용될 수 있으며 모든 위치를 처리하기 위해 HintPaths를 안정적으로 설정하는 데 어려움을 겪고 있다는 것입니다.TFS 루트에서 HintPath를 설정하는 방법

템플릿 프로젝트는 빌드에서 사용하기 위해 로컬 라이브러리와 TFS에서 공통 라이브러리를 찾을 수 있어야합니다. 현재, 우리의 기존 응용 프로그램에 대한 참조는 다음과 같다 :

<Reference Include="Company.Common"> 
    <SpecificVersion>False</SpecificVersion> 
    <HintPath>..\..\..\..\..\..\Core Components\Libraries\Company.Common\Latest\Company.Common.dll</HintPath> 
</Reference> 

그러나 필요한 부모의 수는 루트가 다를 수 있습니다에 얻을 통과 할 수 있습니다.

../, ../../, ../../../ 등 50 개의 조건부 경로를 설정하는 대신 내 첫 번째 생각은 절대 참조를 설정하는 것이 었습니다. 작업 폴더는 우리 조직에서 표준화되어 있으므로 로컬에서는 항상 C : \ Projects \ Core Components \에서 참조를 찾을 수 있습니다. ...

그러나 서버 빌드에는 작동하지 않습니다. 그래서 나는 $ /로 작동하는 일종의 환경 변수가 필요하다고 생각하고 있습니다. 나는 이런 식으로 사진을 찍고있다 :

<Choose> 
    <When Condition="Exists('C:\Projects')"> 
    <ItemGroup> 
     <Reference Include="Company.Common"> 
     <HintPath>C:\Projects\Core Components\Libraries\Company.Common\Latest\Company.Common.dll</HintPath> 
     </Reference> 
    </ItemGroup> 
    </When> 
    <Otherwise> 
    <ItemGroup> 
     <Reference Include="Company.Common"> 
     <HintPath>$(TFSRoot)\Core Components\Libraries\Company.Common\Latest\Company.Common.dll</HintPath> 
     </Reference> 
    </ItemGroup> 
    </Otherwise> 
</Choose> 

그러나 나는 그것을 성취 할 방법을 생각할 수 없다.

+1

을 : 하나는 내장에-VS 다른 빌드 서버에서 환경 변수를 만든 다음 프로젝트 또는 MSBuild에서 파일을 참조하는 매크로로 사용하는 것입니다 . –

+0

건설적인 의견을 추가했습니다. 나는 위의 모든 농구를 뛰어 넘어야한다면 분명히 접근법에 문제가 있다는 것을 덧붙이면서 위와 같이 잘못하고 있다고 덧붙였다. NuGet은 아래 명시된 바와 같이 문제의 해결책입니다. 이진 종속성은 앞으로 나아갈 길이며 코드 종속성은 피해야합니다. –

답변

4

이 문제를 해결하는 방법에 대한 두 가지 제안이 있습니다. 좋은 길과 좋은 길.

좋은 방법은 (그리고 가장 일반적으로) 일부 공유 라이브러리 X가 있고 응용 프로그램 A, B 및 C에서 사용해야하는 경우입니다. 프로젝트 A에서 사용자가 체크인 할 lib 폴더가 있어야합니다 X.dll의 복사본 프로젝트 B는 자신의 lib 폴더를 가지고 있으며 X.dll의 자체 복사본입니다 (A가 의존하는 X의 동일한 버전 일 필요는 없습니다). 등등. 이 모델에서는 A/B/C의 관리자가 X의 새 버전을 가져 와서 lib 폴더를 업데이트 할시기를 결정합니다.

더 나은 방법은 NuGet (패키지 관리자)을 사용하는 것입니다. Project X는 각 새 버전을 NuGet 피드에 어딘가에 게시하고 A/B/C는 해당 NuGet 피드를 구독하며 Visual Studio/TFS Build는 필요에 따라 NuGet 패키지를 자동으로 다운로드합니다. 프로젝트 A는 "나는 X 버전 3.2에 의존한다"거나 "나는 최신 버전의 X에 의존한다"라고 말할 수 있고 NuGet이 작업을 수행 할 수 있기 때문에 약간의 유연성도 제공한다.

+1

@ dylan의 "더 나은 방법"이 실제로 유일한 방법이라고 제안합니다. –

2

찾고있는 것을 달성하기 위해 내가 생각할 수있는 두 가지 방법이 있습니다. 그때는 아마 잘못하고있는 하드 경우

<Reference Include="EntityFramework.SqlServer"> 
    <HintPath>..\..\packages\EntityFramework.6.1.2\lib\net45\EntityFramework.SqlServer.dll</HintPath> 
    <HintPath>$(SolutionDir)packages\EntityFramework.6.1.2\lib\net45\EntityFramework.SqlServer.dll</HintPath> 
    <HintPath>$(ENVIRONMENT_VARIABLE)packages\EntityFramework.6.1.2\lib\net45\EntityFramework.SqlServer.dll</HintPath> 
</Reference>