Cài đặt Riêng tư làm gì trên ProjectReference trong tệp dự án MSBuild?


120

Tôi đã thấy điều này trong một tệp dự án ngày hôm trước:

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

Mọi nút trong một ProjectReferencedường như là tự giải thích (tệp dự án được tham chiếu, GUID, tên để hiển thị trong trình khám phá giải pháp và liệu dự án hiện tại có nên liên kết đến dự án được tham chiếu hay không) ngoại trừ Privatevà trang Mục dự án MSBuild chung không ' t tài liệu giá trị này. (Có một Privatethiết lập tài liệu cho Referencehơn ProjectReference- nhưng nó có Never, AlwaysPreserveNewestcài đặt, không đúng sự thật và sai)

Cài đặt này làm gì?


2
Theo như MSBuild có liên quan, ProjectReference là một nhóm mục (tức là danh sách) và Riêng tư là siêu dữ liệu mục cho mục được bao gồm. Câu trả lời cho câu hỏi của bạn nằm trong những gì bất kỳ bao gồm làm gì với nó. Nói một cách khái quát hơn, đó là loại dự án cụ thể nào? Có thể gắn thẻ câu hỏi của bạn bằng csharp.
Tom Blodget

Ý tôi là "Nhập khẩu" không phải "bao gồm".
Tom Blodget

@malexander: Tôi nghĩ câu trả lời của bạn là tốt nếu bạn phục hồi nó ...
Billy ONeal

2
@Tom: Chắc chắn rồi, nói đúng ra là đúng. Mặt khác, ProjectReferencemục này được (ít nhất) công nhận bởi (ít nhất) cơ sở hạ tầng hỗ trợ C # và C ++ MSBuild; có vẻ như nó được xử lý chủ yếu trong Microsoft.Common.CurrentVersion.targetstệp.
Billy ONeal

Câu trả lời:


126

Các Privatethẻ duy trì sử dụng ghi đè vào "Copy Local" hộp kiểm trong thư mục tài liệu tham khảo Visual Studio. Điều này kiểm soát xem tham chiếu có được sử dụng từ GAC hay nó sẽ sao chép hội đồng tham chiếu vào thư mục xây dựng.

Mặc dù tôi không thể tìm thấy bất kỳ tài liệu MSDN nào về hiệu ứng này (điều ngạc nhiên là quelle), nhưng điều đó là hiển nhiên từ hành vi và từ nhận xét vềMicrosoft.Common.CurrentVersion.targets:1742 nơi nó được áp dụng:

Điều này được ghi lại trong MSDN> Các hạng mục dự án MSBuild chung , và được thể hiện rõ ràng từ hành vi và từ nhận xét ởMicrosoft.Common.CurrentVersion.targets:1742 nơi nó được áp dụng:

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

                                        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
Như Mitch đã nói, nó kiểm soát cài đặt Sao chép cục bộ trong các thuộc tính để tham khảo. Ngoài ra, nó chỉ có thể chứa các giá trị Đúng và Sai. Nếu nó vắng mặt thì giá trị mặc định của True được giả định
GPR

4
Nếu <Private>thiếu, thì nó không tương đương với True. Tìm kiếm "lỗi MSBuild CopyLocal". Ví dụ: xem stackoverflow.com/questions/1132243
xmedeko,

7
@xmedeko, Đúng vậy. Tôi không chắc @GPR lấy từ đâu "Nếu nó vắng mặt thì giá trị mặc định của True được giả định" vì câu trả lời cho biết rõ ràng "[Thiếu] nghĩa là tác vụ này sẽ quyết định xem có coi tham chiếu này là CopyLocal hay không". Hầu hết logic là trongmsbuild\Reference.cs:949
Mitch.

Có thể là ngay cả khi <Private>được đặt thành True, MSBuild vẫn không bao gồm tham chiếu trong Đầu ra nếu nó không được ứng dụng sử dụng? Đây là hành vi hiện tại mà tôi đang mắc phải tại địa phương ...
Ninja

@Ninja, điều này thường xuyên xảy ra nhất nếu MSBuild không thể định vị hội đồng được tham chiếu. Nếu nó không được sử dụng trực tiếp bởi mã, nó vẫn có thể biên dịch thành công. Bạn có thể khắc phục sự cố với ProcMon hoặc MSBuild chi tiết đăng nhập
Mitch

0

Tôi chỉ muốn nói rằng <Private>false</Private>(mà bạn có thể áp dụng cho ProjectReferences) có thể không hoạt động khi sử dụng <MSBuild Projects="$(MSBuildProjectFullPath)" Targets="Publish" Properties="$(_MSBuildProperties)" />và dự án $(MSBuildProjectFullPath)ProjectReferences có <None><CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory></None> . Tôi đã đọc mã nguồn xung quanh https://github.com/dotnet/sdk/blob/master/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Publish.targets và tìm ra giải pháp. Bạn cần xác định _GetChildProjectCopyToPublishDirectoryItems=falsenên một ví dụ sẽ là:<MSBuild Projects="$(MSBuildProjectFullPath)" Targets="Publish" Properties="TargetFramework=$(TargetFramework);_GetChildProjectCopyToPublishDirectoryItems=false" />

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.