Ngăn chặn các tệp PDB và XML lắp ráp tham chiếu được sao chép vào đầu ra


118

Tôi có một dự án Visual Studio 2008 C # /. NET 3.5 với nhiệm vụ xây dựng bài đăng để ZIP nội dung. Tuy nhiên, tôi nhận thấy rằng tôi cũng đang nhận được các tệp .pdb (gỡ lỗi) và .xml (tài liệu) của hội đồng tham chiếu trong thư mục đầu ra (và ZIP) của tôi.

Ví dụ: nếu MyProject.csproj tham chiếu YourAssembly.dll và có các tệp YourAssembly.xml và YourAssembly.pdb trong cùng một thư mục với DLL, chúng sẽ hiển thị trong thư mục đầu ra của tôi (và ZIP).

Tôi có thể loại trừ * .pdb khi ZIP nhưng tôi không thể loại trừ hàng loạt các tệp * .xml vì tôi có các tệp triển khai có cùng phần mở rộng.

Có cách nào để ngăn dự án sao chép các tệp PDB và XML lắp ráp được tham chiếu không?

Câu trả lời:


68

Bạn cũng có thể chỉ định điều này thông qua dòng lệnh:

MsBuild.exe build.file /p:AllowedReferenceRelatedFileExtensions=none

9
Điều này có vẻ như là một cách để thực hiện vì bạn chỉ có thể đưa nó vào đối số MSBuild định nghĩa xây dựng của mình và không phải hack các tệp csproj.
The Muffin Man

2
Đây hoạt động tuyệt vời từ TFS và tiết kiệm cần phải sửa đổi 100s của dự án trong trường hợp của tôi
ste-fu

Cũng hoạt động tốt với các bản dựng kiểu TFS2018 và không phải XAML.
precisionpp

giải pháp gọn gàng và nhanh chóng. Cảm ơn
Karan

158

Tôi muốn có thể thêm và xóa các hội đồng tham chiếu trong ứng dụng chính của mình trong khi tránh phải duy trì các tệp tôi cần xóa hoặc loại trừ.

Tôi đã Microsoft.Common.targetstìm kiếm thứ gì đó sẽ hoạt động và tìm thấy AllowedReferenceRelatedFileExtensionstài sản. Nó mặc định là .pdb; .xmlvì vậy tôi đã xác định rõ ràng nó trong tệp dự án của mình. Điểm bắt buộc là bạn cần một cái gì đó (khoảng trắng là không đủ) nếu không nó sẽ vẫn sử dụng mặc định.

<Project ...>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    ...
    <AllowedReferenceRelatedFileExtensions>
      <!-- Prevent default XML and PDB files copied to output in RELEASE. 
           Only *.allowedextension files will be included, which doesn't exist in my case.
       -->
      .allowedextension
    </AllowedReferenceRelatedFileExtensions> 
  </PropertyGroup>

3
Đây có thể là cách "đúng" nhưng nó quá ẩn, điều này không tốt trong sách của tôi.
Mladen Mihajlovic

1
Điều này hoạt động khi xây dựng từ Visual Studio IDE. Tuy nhiên, nó không hoạt động với tôi khi xây dựng qua MSBuild. Tôi không cần chỉ định nó dưới dạng tùy chọn a / p nếu nó nằm trong tệp dự án.
redcurry

19

Bạn có thể thêm lệnh tạo sự kiện Post Build tương tự như del "$(TargetDir)YourAssembly*.xml", "$(TargetDir)YourAssembly*.pdb"


Cảm ơn. Điều này hoạt động nếu bạn có một danh sách tĩnh các hội đồng được tham chiếu. Tuy nhiên, trong trường hợp của chúng tôi, chúng tôi có hơn hai tá, với nhiều trong số chúng đang hoạt động trong khi chúng tôi cấu trúc lại.
Jason Morse

4
Cá nhân tôi nghĩ đây là câu trả lời chính xác - theo cách khác, bạn đã hack tệp dự án và bất kỳ ai khác (hoặc chính bạn nhiều năm sau) sẽ không biết phải tìm ở đâu để ngăn chặn điều này.
Mladen Mihajlovic

1
Tôi cũng thích cách này hơn. Tôi muốn để bất cứ điều gì cần phải xảy ra (hoặc được thiết kế để xảy ra ngay từ đầu) để kết thúc và sau đó để cho các sự kiện xây dựng bài đăng khiến nó như tôi muốn. Nó chỉ có vẻ sạch sẽ hơn rất nhiều theo cách này!
Arvo Bowen

Ngay cả khi giải pháp này hoạt động, nó không thực sự được tối ưu hóa vì bạn mất thời gian sao chép thứ gì đó mà bạn sẽ xóa. Tôi cũng luôn coi các bước xây dựng trước / sau là các bước hack vì chúng không hoạt động tốt trong một hệ thống xây dựng so với các mục tiêu hoặc tệp proj.
christ.s

Wow @ christ.s, * cười khúc khích * Tôi hy vọng rằng trong mười năm nữa kể từ khi tôi trả lời câu hỏi này, nhóm Visual Studio sẽ làm điều này dễ dàng hơn. :-)
AndrewJacksonZA

5

Đây là một câu hỏi khá cũ, nhưng vì không có câu trả lời về cách tắt tạo các tệp PDB và XML qua giao diện người dùng, tôi nghĩ rằng nó phải ở đây cho hoàn chỉnh.

Trong Visual Studio 2013: trong thuộc tính dự án, dưới tab biên dịch, bỏ chọn "Tạo tệp tài liệu XML", sau đó nhấp vào "Tùy chọn biên dịch nâng cao" bên dưới và thay đổi "Tạo thông tin gỡ lỗi" thành "Không có" và điều đó sẽ thực hiện thủ thuật.


15
Điều đó sẽ không ảnh hưởng đến bất kỳ gói nuget nào mà bạn bao gồm chúng sẽ vẫn có pdbxmlcác tệp.
Lankymart

Tôi đang sử dụng thuộc tính OctoPack trong tệp csproj của mình và điều này đã thực hiện thủ thuật cho các tệp PDB và XML của tôi. Tôi cũng đã sử dụng VS 2015. Xây dựng -> Advanced dưới Output -> thiết lập Thông tin gỡ lỗi không ai sánh kịp dưới Output
Devin Prejean

0

Câu trả lời của tôi bây giờ có thể là tầm thường nhưng tôi muốn chia sẻ tập lệnh BAT mà tôi sử dụng để xóa các tệp xml nếu có một dll tương ứng cho nó. Nó hữu ích nếu bạn chỉ muốn dọn dẹp thư mục đầu ra và có các tệp xml khác không muốn xóa.

SETLOCAL EnableDelayedExpansion

SET targetDir=%1

ECHO Deleting unnecessary XML files for dlls

FOR %%F IN (%targetDir%*.xml) DO (

  SET xmlPath=%%~fF
  SET dllPath=!xmlPath:.xml=.dll!

  IF EXIST "!dllPath!" (
    ECHO Deleting "!xmlPath!"
    DEL "!xmlPath!"
  )
)

Sử dụng:

Cleanup.bat c:\my-output-folder\

Tôi đã mất một giờ để hoàn thành công việc đơn giản này (nhờ công cụ "mở rộng bị trì hoãn") với tất cả các loại tìm kiếm ở đây và ở đó. Hy vọng nó sẽ giúp những người mới BAT khác như tôi.


0

Tôi không gặp nhiều may mắn với các câu trả lời khác, cuối cùng tôi đã tìm ra cách thực hiện điều này trong quá trình triển khai của mình bằng cách sử dụng lệnh "Xóa" được tích hợp sẵn , rõ ràng là có một cách cụ thể bạn cần để triển khai các ký tự đại diện , nó có chút sắc thái , đây là mọi thứ bạn cần được đưa vào "CSPROJ" ( TargetDir là một biến được tích hợp sẵn, được đưa vào tự động) trong thẻ "Dự án":

<Target Name="RemoveFilesAfterBuild">   
    <ItemGroup>
        <XMLFilesToDelete Include="$(TargetDir)\*.xml"/>
        <PDBFilesToDelete Include="$(TargetDir)\*.pdb"/>
    </ItemGroup>
    <Delete Files="@(XMLFilesToDelete)" />
    <Delete Files="@(PDBFilesToDelete)" />
</Target>

Tôi cũng đã gặp sự cố với các thư mục dành riêng cho ngôn ngữ khác nhau được tạo, nếu bạn cũng gặp sự cố đó, bạn cũng có thể xóa các thư mục dành riêng cho ngôn ngữ không sử dụng. Tôi đã chọn chỉ kích hoạt điều này trong loại bản dựng "Phát hành":

<ItemGroup>
    <FluentValidationExcludedCultures Include="be;cs;cs-CZ;da;de;es;fa;fi;fr;ja;it;ko;mk;nl;pl;pt;ru;sv;tr;uk;zh-CN;zh-CHS;zh-CHT">
        <InProject>false</InProject>
    </FluentValidationExcludedCultures> 
</ItemGroup>

<Target Name="RemoveTranslationsAfterBuild" AfterTargets="AfterBuild" Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <RemoveDir Directories="@(FluentValidationExcludedCultures->'$(OutputPath)%(Filename)')" />

    <ItemGroup>
        <XMLFilesToDelete Include="$(TargetDir)\*.xml"/>
        <PDBFilesToDelete Include="$(TargetDir)\*.pdb"/>
    </ItemGroup>
    <Delete Files="@(XMLFilesToDelete)" />
    <Delete Files="@(PDBFilesToDelete)" />
</Target>

-3

Nếu bạn chỉ muốn loại trừ các tệp XML (ví dụ như một bản phát hành gỡ lỗi), bạn có thể làm như sau:

<AllowedReferenceRelatedFileExtensions>
  <!-- Prevent default XML from debug release  -->
      *.xml
 </AllowedReferenceRelatedFileExtensions>

Về cơ bản, mỗi phần mở rộng (được phân tách bằng dấu chấm phẩy) được liệt kê sẽ bị loại trừ.


1
Câu hỏi này và câu trả lời được chấp nhận của nó là 4 năm tuổi, và câu trả lời của bạn gần như là bản sao của câu trả lời được chấp nhận.
Zack

1
Điều khác biệt là cú pháp chỉ dành cho các tệp XML, đó là những gì tôi cần. Tôi đã phải thực hiện một số nghiên cứu để tìm ra cú pháp thích hợp của thẻ này. Tôi thấy câu trả lời ban đầu hữu ích và đã bỏ phiếu cao, nhưng tôi nghĩ rằng tôi có thể tiết kiệm thời gian cho người khác nếu họ chỉ cần lọc một loại tệp cụ thể.
ProVega

11
Nhưng điều này sẽ không bao gồm các tệp xml, không loại trừ nó?
David Gardiner
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.