web-dev-qa-db-ja.com

参照されるアセンブリPDBおよびXMLファイルが出力にコピーされないようにする

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

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

Zipするときに* .pdbを除外できますが、同じ拡張子の展開ファイルがあるため、*。xmlファイルを包括的に除外できません。

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

113
Jason Morse

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

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

プライマリアプリケーションで参照アセンブリを追加および削除できるようにしたかったのですが、削除または除外する必要があるファイルを維持する必要がありませんでした。

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>
144
Jason Morse

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

18
AndrewJacksonZA

これはかなり古い質問ですが、UIを介してPDBファイルとXMLファイルの生成をオフにする方法についての答えがないため、完全を期すためにここにあるべきだと考えました。

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

5
Dingo

私の答えはささいなことかもしれませんが、対応する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
Jeffrey Zhao

私は他の答えにあまり運がなかったので、組み込みの "Delete"コマンド を使用して実装でこれを行う方法を最終的に見つけました。明らかに特定の方法が必要です- implement wildcards 、それは bit nuanced 、これは「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>
0
David Rogers