2017-12-24 34 views
2

저는 오랫동안이 문제로 고심하고 있습니다.msbuild가 참조 된 네이티브 프로젝트의 출력을 C# 프로젝트 출력으로 복사하지 않습니다

셋업 :

<ProjectReference Include="projectB.vcxproj"> 
    <ReferenceOutputAssembly>false</ReferenceOutputAssembly> 
    <OutputItemType>Content</OutputItemType> 
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> 
</ProjectReference> 

이 작품 :

  • C# 프로젝트
  • C++ 프로젝트
  • C# 프로젝트는 다음 행과 C++ 프로젝트에 대한 참조가 with with Visual Studio. 이것은 명령 행에서 devenv를 사용할 때 작동합니다. 명령 줄에서 msbuild를 사용하는 경우 - C++ 프로젝트의 출력 파일이 C# 프로젝트의 출력 디렉터리로 복사되지 않습니다.

    msbuild를 사용하여 해결할 수 없습니다. 그것에 대해 많이 읽으십시오. 아무런 효과가 없습니다. diag verbosity를 사용하여 디버깅을 시도했지만 msbuild와 visual-studio의 로그는 매우 다릅니다 ... 빌드 머신에 유효한 visual-studio가 없으므로 devenv를 사용할 수 없습니다.

    진단 상세와 msbuild를 로그에서 나는 참조 : Target "GetCopyToOutputDirectoryItems" skipped. Previously built successfully. 이것은 비주얼 스튜디오 로그에있는 곳입니다 - 그것은 서로 다른 모양 - 실제로 C#을 출력 디렉터리에 참조 된 기본 파일을 복사에서 작동합니다. ? 빌드 순서와 관련 아마도 뭔가 ..

    msbuild를 로그에서이 - 나는 또한 참조 : 내가 실행이 대상을 볼 수있는 비주얼 스튜디오 빌드 로그에

답변

1

(그것은 바로 GetCopyToOutputDirectoryItems 대상 다음에 오는) Target "_CopyOutOfDateSourceItemsToOutputDirectoryAlways" skipped, due to false condition; ('@(_SourceItemsToCopyToOutputDirectoryAlways)' != '') was evaluated as ('' != ''). 동안 업데이트 3 : 이전 솔루션으로 인해 다중 스레드 빌드를 실행할 때 빌드가 깨지는 등의 원치 않는 부작용이 발생했을 것으로 보입니다. <Targets>Build;BuiltProjectOutputGroup</Targets> ProjectReference 섹션 : 작동하는 것처럼 보인다

현재 솔루션은 추가하는 것입니다.

업데이트 2 :

변경하기 :

Targets="%(_MSBuildProjectReferenceExistent.Targets)"

주석 Build referenced projects when building from the command line. 앞에는은 MSBuild 작업에 C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\Microsoft.Common.CurrentVersion.targets에서

Targets="%(_MSBuildProjectReferenceExistent.Targets);GetTargetPath"

에 - 트릭했다 .

그러나 전체 빌드 프로세스를 이해하지 못하기 때문에이 솔루션에 대한 확신이 없습니다. 이것은 단지 추측입니다.

업데이트 1 :

/p:DesignTimeBuild=true 사용 종속성 빌드 순서에 영향을 미칩니다. 일할 수 없다. 조사 계속 ...

가능한 해결 방법 1 : 나는 아직도 그 모든 무엇인지 정확히 모르겠어요 QUIRKING FOR DEV10

:

C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\Microsoft.Common.CurrentVersion.targets

으로 메세지를 많이 넣어 후 드디어 다음에 도착 약 개발자가이 버크를 제거 할 계획이라고 보았습니다 (https://github.com/Microsoft/msbuild/issues/1890 참조).

갑자기 DesignTimeBuild 다음 줄에 내 눈을 사로 잡은 :

<Output TaskParameter="TargetOutputs" ItemName="_ResolvedProjectReferencePaths" Condition="'%(_MSBuildProjectReferenceExistent.ReferenceOutputAssembly)'=='true' or '$(DesignTimeBuild)' == 'true'"/>

나는 알고 비주얼 스튜디오 내부에이 일이. Google 검색 결과는 https://github.com/Microsoft/msbuild/wiki/MSBuild-Tips-&-Tricks입니다. 경로가 짧아서 /p:DesignTimeBuild=true을 msbuild 명령 줄에 추가했습니다.

이렇게하면 효과가 있습니다. 참조 된 어셈블리가 복사되었습니다.

나는 이것이 해결책이 될 것이라고 생각하지 않지만 작동하고, 다른 것을 깨뜨리지 않는 것처럼 보입니다 (아직).

다른 의견을 환영합니다.

+0

'BuiltProjectOutputGroup' 대상에 대한 문서가 있습니까? – yair