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


118

콘텐츠를 압축하는 빌드 후 작업이 포함 된 Visual Studio 2008 C # /. NET 3.5 프로젝트가 있습니다. 그러나 내 출력 디렉터리 (및 ZIP)에 참조 된 어셈블리의 .pdb (디버그) 및 .xml (문서) 파일도 가져오고 있습니다.

예를 들어 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 파일을 해킹 할 필요가 없기 때문에 이것은 갈 길처럼 보입니다.
The Muffin Man

2
이 TFS에서 잘 작동하고 내 경우에는 프로젝트의 100 단위를 수정하지 저장합니다
인트 - Fu는

또한 TFS2018 및 비 XAML 스타일 빌드에서도 잘 작동합니다.
knipp

깔끔하고 빠른 솔루션. 감사합니다
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 2015

1
이것은 Visual Studio IDE에서 빌드 할 때 작동했습니다. 그러나 MSBuild를 통해 빌드 할 때는 작동하지 않았습니다. 프로젝트 파일에있는 경우 / p 옵션으로 지정할 필요가 없습니다.
redcurry

19

다음과 유사한 Post Build 이벤트 명령을 추가 할 수 있습니다. del "$(TargetDir)YourAssembly*.xml", "$(TargetDir)YourAssembly*.pdb"


감사. 이것은 참조 된 어셈블리의 정적 목록이있는 경우에 작동합니다. 그러나 우리의 경우에는 우리가 리팩토링하는 동안 많은 것들이 유동적으로 24 개가 넘었습니다.
Jason Morse

4
개인적으로 저는 이것이 정답이라고 생각합니다. 다른 방법은 여러분이 프로젝트 파일을 해킹하고 다른 사람 (또는 자신이 몇 년 후)이 방지되는 것을 볼 수있는 곳을 모를 것입니다.
Mladen Mihajlovic 2015

1
나도이 방법을 선호합니다. 나는 필요한 일이 무엇이든 (또는 처음에 일어나도록 설계 되었음) 끝내도록하고, 포스트 빌드 이벤트가 결국 내가 원하는대로 만들도록하는 것을 좋아합니다. 이렇게하면 훨씬 깨끗해 보입니다!
Arvo Bowen

이 솔루션이 작동하더라도 삭제할 항목을 복사하는 데 시간이 걸리기 때문에 실제로 최적화되지 않았습니다. 또한 사전 / 사후 빌드 단계는 대상 또는 proj 파일보다 빌드 시스템에서 잘 작동하지 않기 때문에 항상 해킹으로 간주했습니다.
christ.s

Wow @ christ.s, * chuckle *이 질문에 답한 후 10 년 동안 Visual Studio 팀이이 작업을 더 쉽게 만들었 으면합니다. :-)
AndrewJacksonZA

5

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

Visual Studio 2013 : 프로젝트 속성의 컴파일 탭에서 "XML 문서 파일 생성"을 선택 취소 한 다음 그 아래에있는 "고급 컴파일 옵션"을 클릭하고 "디버그 정보 생성"을 "없음"으로 변경하면됩니다.


15
즉, 그들은 여전히 것 등 어떤 nuget 패키지에 영향을주지 않습니다 pdbxml파일을.
Lankymart 2015-10-29

내 csproj 파일에서 OctoPack 속성을 사용하고 있으며 이것은 내 PDB 및 XML 파일에 대한 트릭을 수행했습니다. 또한 VS 2015를 사용하고있었습니다. 빌드-> 출력에서 ​​고급-> 출력에서 ​​디버그 정보를 없음으로 설정
Devin Prejean

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\

여기저기서 모든 유형의 검색과 함께이 간단한 작업 ( "지연된 확장"항목 덕분에)을 완료하는 데 한 시간이 걸렸습니다. 나와 같은 다른 BAT 초보자에게 도움이되기를 바랍니다.


0

나는 다른 답변에 많은 행운을하지 않았다, 나는 마침내 내장에 사용하여 내 구현에서이 작업을 수행하는 방법을 알아 냈다 "삭제"명령을 분명히 당신이해야 할 특정의 방법이 와일드 카드를 구현은 , 그것의 약간 미묘한 차이 , 여기에 "CSPROJ"( TargetDir 은 자동으로 포함 된 내장 변수)에 넣어야하는 모든 것을 "Project"태그 아래에 있습니다.

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

-3

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

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

기본적으로 나열된 각 확장자 (세미콜론으로 구분)는 제외됩니다.


1
이 질문과 수락 된 답변은 4 년 전이며 귀하의 답변은 수락 된 답변의 복사-붙여 넣기입니다.
Zack

1
다른 점은 내가 필요한 XML 파일의 구문입니다. 이 태그의 적절한 구문을 조사해야했습니다. 원래 답변이 도움이되고 찬성했지만 특정 파일 형식 만 필터링해야하는 경우 다른 사람이 시간을 절약 할 수 있다고 생각했습니다.
ProVega 2015 년

11
그러나 여기 에는 xml 파일 이 포함 되지 않고 제외되지 않습니까?
David Gardiner
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.