参照アセンブリのPDBおよびXMLファイルが出力にコピーされるのを防ぐ


118

Visual Studio 2008 C#/。NET 3.5プロジェクトで、コンテンツをZI​​P圧縮するビルド後のタスクがあります。ただし、参照先のアセンブリの.pdb(デバッグ)ファイルと.xml(ドキュメント)ファイルも出力ディレクトリ(およびZIP)にあることがわかります。

たとえば、MyProject.csprojがYourAssembly.dllを参照し、YourAssembly.xmlおよびYourAssembly.pdbファイルがDLLと同じディレクトリにある場合、それらは出力ディレクトリ(およびZIP)に表示されます。

圧縮時に* .pdbを除外できますが、同じ拡張子のデプロイメントファイルがあるため、*。xmlファイルを一括除外できません。

プロジェクトが参照されているアセンブリのPDBおよびXMLファイルをコピーしないようにする方法はありますか?

回答:


68

コマンドラインから指定することもできます:

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

9
ビルド定義のMSBuild引数に含めるだけで、csprojファイルをハックする必要がないため、これは適切な方法です。
マフィンマン

2
これはTFSからうまく機能し、私の場合、数
百の

また、TFS2018および非XAMLスタイルのビルドでもうまく機能します。
knipp '11 / 10/18

きちんとした&迅速なソリューション。ありがとう
Karan

158

削除または除外する必要のあるファイルを維持する必要性を回避しながら、プライマリアプリケーションで参照アセンブリを追加および削除できるようにしたいと考えました。

Microsoft.Common.targetsはうまくいくものを探して掘り下げ、そのAllowedReferenceRelatedFileExtensions物件を見つけました。デフォルト.pdb; .xmlでは、プロジェクトファイルで明示的に定義されています。問題は、何かが必要なことです(空白では不十分)。それ以外の場合は、デフォルトが使用されます。

<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
これは「正しい」方法かもしれませんが、あまりにも隠されているので、私の本では良くありません。
Mladen Mihajlovic

1
これは、Visual Studio IDEからビルドするときに機能しました。ただし、MSBuildを使用してビルドする場合は機能しませんでした。プロジェクトファイルにある場合は、/ pオプションとして指定する必要はありません。
Redcurry

19

次のようなビルド後イベントコマンドを追加できます。 del "$(TargetDir)YourAssembly*.xml", "$(TargetDir)YourAssembly*.pdb"


ありがとう。これは、参照されるアセンブリの静的リストがある場合に機能します。しかし、私たちのケースでは、20を超える数があり、それらの多くはリファクタリング中に流動的でした。
Jason Morse、

4
個人的には、これが正解だと思います。もう1つの方法は、プロジェクトファイルをハッキングして、他の誰か(または数年後の自分)が、これが阻止されていることを確認する場所を知らない場合です。
Mladen Mihajlovic

1
私もこの方法を好みます。私は何が起こる必要があるのか​​(またはそもそも起こるように設計されていたもの)を終了させ、その後、ビルド後のイベントで最後に望むようにするのが好きです。このようにすごくきれいに見えます!
Arvo Bowen

このソリューションでも機能しますが、削除するものをコピーする時間を失うため、最適化されていません。また、ビルドシステムでは、ターゲットまたはprojファイルよりもビルドシステムでうまく機能しないため、ビルドの前/後のステップをハックと常に見なしてきました。
christ.s

うわー@ christ.s、* chuckle *この質問に答えてから10年間で、Visual Studioチームがこれを容易にしてくれることを願っています。:-)
AndrewJacksonZA

5

これはかなり古い質問ですが、UIを介してPDBおよびXMLファイルの生成をオフにする方法についての回答がないため、完全を期すためにここに記載する必要があります。

Visual Studio 2013の場合:プロジェクトのプロパティの[コンパイル]タブで、[XMLドキュメントファイルの生成]をオフにし、その下の[詳細なコンパイルオプション]をクリックして、[デバッグ情報の生成]を[なし]に変更します。


15
それは、それらがまだ持っているnugetパッケージpdbxmlファイルには影響しません。
Lankymart、2015年

私のcsprojファイルでOctoPackプロパティを使用していますが、これは私のPDBファイルとXMLファイルに役立ちました。私はまた、VS 2015のビルドを使用していた- >詳細は、出力の下- >出力の下でnoneにデバッグ情報を設定する
デヴィンプレジャンに

0

私の答えはささいなことかもしれませんが、それに対応するdllがある場合、xmlファイルを削除するために使用するBATスクリプトを共有したいと思います。出力フォルダをクリーンアップしたいだけで、削除したくない他のxmlファイルがある場合に便利です。

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!"
  )
)

使用法:

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

あちこちであらゆる種類の検索を使用して、この単純な作業(「遅延拡張」のおかげ)を完了するのに1時間かかりました。それが私のような他のBAT初心者に役立つことを願っています。


0

私は他の回答の多くの運を持っていなかった、私は最終的に構築された中に使用することによって、私の実装でこれを行う方法を考え出し、「削除」コマンドを、明らかにあなたがする必要がある特定の方法があり、ワイルドカードを実装するには、それの ビットが微妙な、ここです「Project」タグの下にある「CSPROJ」(TargetDirは組み込み変数であり、自動的に含まれる)に配置する必要があるすべて:

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

生成されるさまざまな言語固有のフォルダーにも問題がありました。その問題がある場合は、未使用の言語固有のフォルダーも削除できます。私はビルドタイプ「リリース」の下でのみこれをトリガーすることを選択しました:

<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

XMLファイル(たとえば、デバッグリリース)のみを除外する場合は、次のようにします。

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

基本的に、リストされている各拡張子(セミコロンで区切られている)は除外されます。


1
この質問とその受け入れられた回答は4年前のものであり、あなたの回答はほぼ受け入れられた回答のコピーアンドペーストです。
ザック

1
異なるのは、XMLファイルの構文であり、これが私が必要としていたものです。このタグの適切な構文について、いくつかの調査を行わなければなりませんでした。私は元の回答が役に立ち、それを賛成票を投じましたが、特定のファイルタイプをフィルター処理する必要があるだけの場合は、他の誰かを時間を節約できると考えました。
ProVega

11
しかし、これはXMLファイルが含まれるのではなく、除外されないのでしょうか?
David Gardiner
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.