2017-11-02 9 views
0

이 프로젝트를 빌드해야하며 일부 이상한 습관이 필요합니다. 그들은 다른 프로젝트의 빌드 프로세스의 결과로 생성 된 링크 된 코드 파일에 의존합니다. 이 프로젝트는 하위 폴더에 있습니다.Resolve .NET 4.7 외부 프로젝트 MSBuild 대상을 통한 NuGet 종속성

따라서 프로젝트를 빌드하기 전에 하위 프로젝트를 빌드해야합니다. 이것은 각 프로젝트의 BeforeBuild 타겟에 사용자 정의 빌드 타겟을 추가함으로써 이루어지며 작동하는 것 같습니다. 그러나 하위 프로젝트는 NuGet 종속성을 복원하지 않고 빌드하지 않습니다.

분명히하기 :이 패턴은 완전히 불쾌감을 안겨주지 만이 패턴을 사용하는 모든 프로젝트를 리팩터링하는 인력은 없습니다. 우리는 단지 한 단계로 안정적으로 컴파일 할 수 있도록 노력하고 있습니다.

이러한 외부 프로젝트 종속성의 각

은과 같이, 사용자 정의 ItemGroup에 나열되어 있습니다 : 우리는 사용자 지정 각 프로젝트의 BeforeBuild 대상에서 호출 빌드 대상 추가하여이 문제를 해결하기 위해 노력했습니다

<ItemGroup> <ExternalDependantProjects Include= "..\<subfolder>\<project>\<project>.csproj" /> </ItemGroup>

. 먼저 ResolveNuGetPackageAssets를 빌드 타겟으로 사용해 보았지만 net47을 타겟팅하는 동안 netcore에서만 지원된다는 사실을 발견했습니다.

이제 외부 프로젝트의 NuGet 종속성을 복원하는 사용자 정의 빌드 대상을 작성하려고합니다. <Exec Command="nuget restore @(ExternalDependantProjects)" />과 다소 복잡한 & 해키 PowerShell을 시도 : <Exec Command="powershell.exe -command &quot;&apos;@(ExternalDependantProjects, '&apos; &apos;')&apos; | foreach { nuget restore $_ }&quot;" />

단순히 주요 프로젝트가 아닌 외부 프로젝트의 패키지를 복원하려고 두 경우 모두 우리는 지금처럼 똑바로 앞으로 접근을 시도했습니다. @ (ExternalDependantProjects)는 공백과 같으므로 새 인수가 추가되지 않습니다. using을 사용하면 @ (ExternalDependantProjects)가 아무 것도 반환하지 않는다는 것을 알 수 있습니다. 그러나 MSBuild "빌드"대상을 호출 할 때 "프로젝트"매개 변수로 작동합니다. 그래서 우리는 잘못된 방식으로 Item 매개 변수를 사용하고 있다고 의심합니다. 아이템의 Include 속성에 접근하는 문법이 있을까요?

그러나 문제를 해결할 수 있다면 제대로 작동하는지 확신 할 수 없습니다. 하위 프로젝트에서 nuget restore 명령을 사용하여 테스트했으며 package.conf의 모든 패키지가 설치되었다는 응답을 항상받습니다. 그러나 외부 프로젝트의 \ packages \는 비어 있고 packages.conf에는 6 개의 패키지가 지정되어 있습니다 (VS의 "References"에도 누락되어 있으며 참조의 HintPath는 .. \ packages로 올바르게 이동합니다).

우리는 세 가지면에서 혼란 스럽습니다. MSBuild 대상에서 ExternalDependentProjects Item include 경로를 참조하려면 어떻게해야합니까? NuGet CLI를 복원하지 않는 이유는 무엇이며이 문제를 해결하는 올바른 방법이기도합니다. ? 우리가 완전히 잘못된 길로 내려 갔습니까?

+0

이 해킹해야 할 이유가 명확하지 않다. 그냥 다른 프로젝트와 마찬가지로 정상적인 프로젝트로 만듭니다. 당신이해야 할 일은 그것이 다른 것들보다 먼저 만들어 지는지 확인하는 것입니다. MSBuild는 아마도 스스로 알아낼 수 없으므로 도움을 받아야 할 것입니다. 솔루션 노드를 마우스 오른쪽 단추로 클릭하고 프로젝트 종속성을 선택하십시오. –

+1

@ 얀 스키 (Jansky),이 문제는 어떻습니까? 이 문제가 해결 되었습니까? 그렇지 않은 경우이 문제에 대한 최신 정보를 알려주십시오. –

+0

헤이 @ 레오 - MSFT, 나는 당신의 응답에 넣은 모든 노력에 정말로 감사드립니다. 그것은 나에게 해결책을 향한 좋은 몇 가지 실을주었습니다. 그러나 나는 다른 프로젝트로 옮겼습니다. 언제 해결할 시간이 있는지 확신 할 수 없습니다. 어쨌든 나는 지금 너를 대답으로 표시 할 것이다. – Jansky

답변

3

을 우리이 (가) ExternalDependentProjects 항목, 왜 NuGet은 CLI 작업을 복원하고,이 문제를 해결 갈이도 올바른 방법입니다하지 않습니다 MSBuild를 타겟으로부터의 경로를 포함 참조 어떻게해야합니까? 우리가 완전히 잘못된 길로 내려 갔습니까?

당신은 옵션 -OutputDirectory하여 사용자 지정 빌드 대상을 작성해야하므로 사용자 지정 빌드 대상은 다음과 같이해야한다 :

<Target Name="BeforeBuild"> 
     <Exec Command="nuget restore @(ExternalDependantProjects) -OutputDirectory ..\<subfolder>\packages" /> 
    </Target> 

을이 대상으로, 외부 프로젝트에 대한 NuGet 패키지가 성공적으로 복원됩니다.

게다가 @(ExternalDependantProjects)의 값이 비어 있지 않은 경우 대상에이 값을 반향 할 수 있습니다.

아래는 내 테스트 샘플입니다, 당신은 몇 가지 세부 정보를 참조 할 수 있습니다 :

ExternalpProjectTestExternalProject 외부 프로젝트 이름, 하위 폴더 이름입니다.

<ItemGroup> 
    <ExternalDependantProjects Include= "..\ExternalpProject\TestExternalProject\TestExternalProject.csproj" /> 
</ItemGroup> 

<Target Name="BeforeBuild"> 
    <Message Text="Restore package for Externalp Project" Importance="high"></Message> 
    <Exec Command="nuget restore @(ExternalDependantProjects) -OutputDirectory ..\ExternalpProject\packages" /> 
</Target> 

<Target Name="AfterBuild"> 
    <Message Text="Display the value of ExternalDependantProjects" Importance="high"></Message> 
    <Message Text="@(ExternalDependantProjects)"></Message> 
</Target> 

enter image description here

1

NuGet은 솔루션 파일에서 복원 할 packages.config 프로젝트를 찾습니다. 모든 프로젝트가 솔루션 파일에 있고 nuget.exe restore <solution file>을 실행하면 프로젝트 파일에서 어떤 일이 일어나고 있는지에 관계없이 복원해야합니다.

사용자 지정 시나리오의 해결 방법으로 폴더의 모든 packages.config 파일을 검색하는 스크립트를 작성한 다음 파일에 직접 nuget.exe restore <packages.config> -SolutionDirectory <solution root>을 호출 할 수 있습니다. packages.config를 복원하는 데 필요한 유일한 부분은 packages.config 파일에서 ID/버전 목록을 검색하여 솔루션 수준 패키지 폴더로 다운로드하고 압축을 풀 수 있도록하는 것입니다.

ReferenceOutputAssembly=false과 함께 프로젝트 참조를 사용하여 서로를 참조하지 않고 원하는 순서대로 프로젝트를 빌드하는 것이 좋습니다.참조 : https://blogs.msdn.microsoft.com/kirillosenkov/2015/04/04/how-to-have-a-project-reference-without-referencing-the-actual-binary/