개인 설정은 MSBuild 프로젝트 파일의 ProjectReference에서 무엇을합니까?


120

나는 요 전에 프로젝트 파일에서 이것을 보았다.

<ProjectReference Include="Foo\Bar\Baz.csproj">
    <Project>{A GUID HERE}</Project>
    <Name>Baz</Name>
    <Private>False</Private> <!-- ??? -->
    <ReferenceOutputAssembly>False</ReferenceOutputAssembly>
</ProjectReference>

A의 모든 노드 ProjectReference가 나타납니다 자체가 설명 (참조 된 프로젝트 파일이 GUID는, 이름이 솔루션 탐색기에 표시하고 있는지 여부를 현재 프로젝트가 참조 된 프로젝트에 연결해야합니다)를 제외시켰다 될 수 있습니다 Private, 그리고 공통의 MSBuild 프로젝트 항목 '페이지 아무튼 t이 값을 문서화합니다. (이 A의 Private문서화 설정 Reference보다는이 ProjectReference-하지만 그것을 가지고 Never, Always그리고 PreserveNewest진실과 거짓없는 설정)

이 설정의 기능은 무엇입니까?


2
MSBuild와 관련하여 ProjectReference는 항목 그룹 (즉, 목록)이고 Private은 포함 된 항목에 대한 항목 메타 데이터입니다. 귀하의 질문에 대한 대답은 포함하는 것이 그것으로 무엇을 하는가에 있습니다. 보다 일반적인 용어로 어떤 특정 유형의 프로젝트입니까? csharp로 질문에 태그를 지정할 수 있습니다.
Tom Blodget 2014 년

나는 "포함"이 아니라 "수입"을 의미했다.
Tom Blodget 2014 년

@malexander : 나는 당신이 ... 그것을 삭제를 취소하려는 경우 당신의 대답은 좋은 생각
빌리 ONeal을

2
@Tom : 물론입니다. 엄밀히 말하면 사실입니다. 반면에 ProjectReference항목은 (적어도) C # 및 C ++ MSBuild 지원 인프라에 의해 인식됩니다. 대부분 Microsoft.Common.CurrentVersion.targets파일 에서 처리되는 것처럼 보입니다 .
Billy ONeal 2014 년

답변:


126

Private태그는 Visual Studio를 참조 폴더에서 "로컬 복사"체크 박스에 사용자 재정을 유지합니다. 참조가 GAC에서 사용되는지 또는 참조 된 어셈블리를 빌드 디렉터리로 복사할지 여부를 제어합니다.

이 효과에 대한 MSDN 문서를 찾을 수는 없지만 (놀라움), 동작과 적용되는 주석에서Microsoft.Common.CurrentVersion.targets:1742 분명합니다 .

이것은 MSDN> Common MSBuild project items에 문서화되어 있으며 적용되는 동작 및 주석에서Microsoft.Common.CurrentVersion.targets:1742 분명합니다 .

  <!--
    ============================================================

                                        ResolveAssemblyReferences

    Given the list of assemblies, find the closure of all assemblies that they depend on. These are
    what we need to copy to the output directory.

        [IN]
        @(Reference) - List of assembly references as fusion names.
        @(_ResolvedProjectReferencePaths) - List of project references produced by projects that this project depends on.

            The 'Private' attribute on the reference corresponds to the Copy Local flag in IDE.
            The 'Private' flag can have three possible values:
                - 'True' means the reference should be Copied Local
                - 'False' means the reference should not be Copied Local
                - [Missing] means this task will decide whether to treat this reference as CopyLocal or not.

        [OUT]
        @(ReferencePath) - Paths to resolved primary files.
        @(ReferenceDependencyPaths) - Paths to resolved dependency files.
        @(_ReferenceRelatedPaths) - Paths to .xmls and .pdbs.
        @(ReferenceSatellitePaths) - Paths to satellites.
        @(_ReferenceSerializationAssemblyPaths) - Paths to XML serialization assemblies created by sgen.
        @(_ReferenceScatterPaths) - Paths to scatter files.
        @(ReferenceCopyLocalPaths) - Paths to files that should be copied to the local directory.
    ============================================================
    -->

7
Mitch가 말했듯이 참조 속성에서 로컬 복사 설정을 제어합니다. 또한 True 및 False 값만 포함 할 수 있습니다. 없는 경우 기본값 True로 가정합니다
GPR

4
<Private>이 누락 된 경우 True. "MSBuild CopyLocal 버그"를 검색합니다. 예 : stackoverflow.com/questions/1132243
xmedeko

7
@xmedeko, 맞습니다. @GPR이 어디에서 "없으면 기본값 True로 가정합니다."라는 대답이 명시 적으로 "[Missing]은이 참조를 CopyLocal로 처리할지 여부를 결정한다는 것을 의미하므로"확실하지 않습니다. 논리의 대부분은msbuild\Reference.cs:949
Mitch

가로 <Private>설정되어 있어도 True응용 프로그램에서 사용하지 않는 경우 MSBuild가 여전히 출력에 참조를 포함하지 않을 수 있습니까? 이것이 내가 로컬에서 얻는 현재 동작입니다 ...
Ninja

@Ninja, MSBuild가 참조 된 어셈블리를 찾을 수없는 경우 가장 자주 발생합니다. 코드에서 직접 사용하지 않는 경우에도 성공적으로 컴파일 될 수 있습니다. procmon 또는 MSBuild 세부 로깅으로
Mitch

0

나는 단지 상태로 원하는 <Private>false</Private>(당신이 적용 할 수있는 ProjectReferenceS) 사용하지 않을 일 수있는 경우 <MSBuild Projects="$(MSBuildProjectFullPath)" Targets="Publish" Properties="$(_MSBuildProperties)" />및 프로젝트 $(MSBuildProjectFullPath)유무 ProjectReference의이 되세요 <None><CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory></None> . https://github.com/dotnet/sdk/blob/master/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Publish.targets 주변의 소스 코드를 읽고 해결책을 찾았습니다. _GetChildProjectCopyToPublishDirectoryItems=false예를 들면 다음과 같이 정의해야 합니다.<MSBuild Projects="$(MSBuildProjectFullPath)" Targets="Publish" Properties="TargetFramework=$(TargetFramework);_GetChildProjectCopyToPublishDirectoryItems=false" />

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.