programing

참조 어셈블리 PDB 및 XML 파일이 출력에 복사되지 않도록 방지

oldcodes 2023. 10. 11. 20:57
반응형

참조 어셈블리 PDB 및 XML 파일이 출력에 복사되지 않도록 방지

저는 Visual Studio 2008 C#/를 가지고 있습니다.콘텐츠 ZIP을 위한 포스트 빌드 작업이 포함된 NET 3.5 프로젝트.그러나 참조된 어셈블리의 .pdb(디버그) 및 .xml(문서) 파일도 출력 디렉토리(및 ZIP)에 있습니다.

예를 들어, MyProject.csproj가 YourAssembly.dll을 참조하고 DLL과 동일한 디렉토리에 YourAssembly.xml 및 YourAssembly.pdb 파일이 있는 경우 이 파일은 내 출력 디렉토리(및 ZIP)에 표시됩니다.

ZIP을 수행할 때 *.pdb를 제외할 수는 있지만 확장자가 동일한 배포 파일이 있으므로 *.xml 파일을 포괄적으로 제외할 수는 없습니다.

프로젝트에서 참조 어셈블리 PDB와 XML 파일을 복사하는 것을 방지할 수 있는 방법이 있습니까?

삭제하거나 제외해야 할 파일을 유지할 필요가 없도록 주 응용 프로그램에서 참조된 어셈블리를 추가하고 제거할 수 있기를 원했습니다.

헤집고 들어갔습니다.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>

명령줄을 통해서도 다음을 지정할 수 있습니다.

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

Post Build 와 할 수 .del "$(TargetDir)YourAssembly*.xml", "$(TargetDir)YourAssembly*.pdb"

저는 상위 2개의 답이 안 맞았습니다.저는 이 링크에서 저에게 적합한 해결책을 찾았습니다.http://kitsula.com/Article/How-to-exclude-xml-doc-files-from-msbuild .

혹시 모르니 위 링크가 작동하지 않습니다.

  1. Solution Explorer에서 프로젝트 언로드

  2. 프로젝트를 마우스 오른쪽 단추로 클릭하고 'edit *.csproj'를 클릭합니다.

  3. 각 환경의 속성 그룹 섹션에서 다음 줄을 추가합니다.

  4. 프로젝트를 다시 로드하고 재구성합니다.

     <AllowedReferenceRelatedFileExtensions>
              *.pdb;
              *.xml
     </AllowedReferenceRelatedFileExtensions>
    

이것은 다소 오래된 질문이지만, UI를 통해 PDB 및 XML 파일을 생성하는 방법에 대한 답이 없기 때문에 완성도를 위해 여기에 있어야 한다고 생각했습니다.

Visual Studio 2013: 프로젝트 속성의 컴파일 탭에서 "XML 문서 파일 생성"을 선택 취소한 다음 아래의 "Advanced Complete Options"를 클릭하고 "Generate debug info"를 "None"으로 변경하면 효과가 나타납니다.

다른 답변들은 운이 좋지 않았습니다. 마침내 내장된 "Delete" 명령을 사용하여 구현에서 이 작업을 수행하는 방법을 알아냈습니다. 와일드카드를 구현하는 데 필요한 특정한 방법이 있는 것 같습니다. 약간 미묘합니다. 여기 "CSPROJ"에 입력해야 하는 모든 것이 있습니다(TargetDir는 내장 변수이며,자동으로 포함됨) "프로젝트" 태그 아래:

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

여러 언어별 폴더가 생성되는 데도 문제가 있었습니다. 사용하지 않는 언어별 폴더도 제거할 수 있습니다.빌드 유형 "Release(릴리즈)"에서만 트리거를 선택했습니다.

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

제 대답은 이제 사소한 것일 수도 있지만 xml 파일을 삭제할 때 사용하는 BAT 스크립트를 해당 dll이 있을 경우 공유하고 싶습니다.출력 폴더만 정리하고 제거를 원하지 않는 다른 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\

이 간단한 작업을 마치는데 한 시간이 걸렸습니다("확장이 지연된" 작업 덕분에). 여기저기서 온갖 종류의 검색을 수행했습니다.저 같은 다른 BAT 초보자들에게 도움이 되었으면 좋겠습니다.

으로.AllowedReferenceRelatedFileExtensions위에 다른 사람들이 제안한 것과 같은 속성은 프로젝트 파일이나 msbuild call을 통해서도 잘 작동합니다.

하지만 한 가지 주의할 점이 있는데, 그것은 보편적으로 작동한다는 것입니다.

서로 참조하는 프로젝트가 많으면 외부 pdbs뿐만 아니라 상위 프로젝트에서 참조하는 하위 프로젝트에 속하는 pdbs도 제거됩니다.

프로젝트 기반 설정으로 다시 돌아가 '하단' 프로젝트에만 추가하는 것도 가능하지만, 여전히 상위 프로젝트에서 직접 중간 외부 참조를 피하기 어려워 이를 제대로 제어하는 방법을 잘 모르겠습니다.

외부 라이브러리에서 오는 모든 pdbs를 제거하되 내부 프로젝트 참조에서 오는 모든 pdbs를 유지하는 보편적인 방법을 찾는 것이 좋을 것 같습니다.

황금 수단에 효과가 있는 것으로 보이는 한 가지는 다음과 같은 조합을 사용하는 것입니다.

/p:AllowedReferenceRelatedFileExtensions=.xml;.config /p:CopyLocalLockFileAssemblies=false 

CopyLocalLockFileAssemblies false로 됩니다 NuGet에서 는 false해를은합니다.AllowedReferenceRelatedFileExtensionsproperty는 외부 NuGet 패키지에서 ".pdb" 파일을 제외하도록 설정되어 있지만 다른 모든 관련 파일(.xml" 및 ".config" 파일)을 포함합니다.PDB 파일을 포함하는 로컬 참조 프로젝트는 빌드 중에도 PDB 파일이 출력 디렉토리에 복사됩니다.

XML 파일(예: 디버그 릴리스)만 제외하려면 다음과 같은 작업을 수행할 수 있습니다.

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

기본적으로 나열된 각 확장자(반콜론으로 제한됨)는 제외됩니다.

언급URL : https://stackoverflow.com/questions/2011434/preventing-referenced-assembly-pdb-and-xml-files-copied-to-output

반응형