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

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

<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진실과 거짓없는 설정)

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



답변

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.
    ============================================================
    -->


답변

나는 단지 상태로 원하는 <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" />


답변