การป้องกันไม่ให้ไฟล์แอสเซมบลี PDB และ XML อ้างอิงถูกคัดลอกไปยังเอาต์พุต


118

ฉันมีโปรเจ็กต์ Visual Studio 2008 C # /. NET 3.5 ที่มีงานสร้างโพสต์เพื่อ ZIP เนื้อหา อย่างไรก็ตามฉันพบว่าฉันได้รับไฟล์แอสเซมบลีที่อ้างอิง '.pdb (debug) และ. xml (เอกสารประกอบ) ในไดเร็กทอรีเอาต์พุต (และ ZIP)

ตัวอย่างเช่นหาก MyProject.csproj อ้างอิง YourAssembly.dll และมีไฟล์ YourAssembly.xml และ YourAssembly.pdb ในไดเร็กทอรีเดียวกับ DLL ไฟล์เหล่านี้จะปรากฏในไดเร็กทอรีเอาต์พุตของฉัน (และ ZIP)

ฉันสามารถยกเว้น * .pdb เมื่อ ZIP ได้ แต่ฉันไม่สามารถครอบคลุมยกเว้นไฟล์ * .xml ได้เนื่องจากฉันมีไฟล์การปรับใช้ที่มีนามสกุลเดียวกัน

มีวิธีป้องกันไม่ให้โครงการคัดลอกไฟล์ PDB และ XML ของแอสเซมบลีที่อ้างถึงหรือไม่

คำตอบ:


68

คุณสามารถระบุสิ่งนี้ผ่านทางบรรทัดคำสั่ง:

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

9
ดูเหมือนว่าจะไปได้เพราะคุณสามารถรวมไว้ในอาร์กิวเมนต์ MSBuild นิยามบิวด์ของคุณและไม่ต้องแฮ็กไฟล์ csproj
The Muffin Man

2
วิธีนี้ใช้งานได้ดีจาก TFS และช่วยประหยัดไม่ต้องแก้ไข 100 โครงการในกรณีของฉัน
ste-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

1
สิ่งนี้ใช้ได้ผลเมื่อสร้างจาก Visual Studio IDE อย่างไรก็ตามมันไม่ได้ผลสำหรับฉันเมื่อสร้างผ่าน MSBuild ฉันไม่จำเป็นต้องระบุเป็นตัวเลือก / p หากอยู่ในไฟล์โครงการ
redcurry

19

คุณสามารถเพิ่มคำสั่ง Post Build event ที่คล้ายกับ del "$(TargetDir)YourAssembly*.xml", "$(TargetDir)YourAssembly*.pdb"


ขอบคุณ วิธีนี้ใช้ได้ถ้าคุณมีรายการแอสเซมบลีที่อ้างอิงแบบคงที่ อย่างไรก็ตามในกรณีของเราเรามีมากกว่าสองโหลโดยหลายคนอยู่ในฟลักซ์ในขณะที่เราปรับโครงสร้างใหม่
Jason Morse

4
โดยส่วนตัวแล้วฉันคิดว่านี่เป็นคำตอบที่ถูกต้อง - วิธีอื่นที่ทำให้คุณแฮ็กไฟล์โครงการและคนอื่น ๆ (หรือตัวคุณเองในอีกหลายปีต่อมา) จะไม่รู้ว่าจะมองหาสิ่งนี้ได้อย่างไร
Mladen Mihajlovic

1
ฉันชอบวิธีนี้เช่นกัน ฉันชอบปล่อยให้สิ่งที่ต้องเกิดขึ้น (หรือถูกออกแบบมาให้เกิดขึ้นตั้งแต่แรก) ให้เสร็จสิ้นแล้วปล่อยให้โพสต์สร้างเหตุการณ์ให้เป็นไปตามที่ฉันต้องการในที่สุด ดูเหมือนว่าจะสะอาดกว่านี้มาก!
Arvo Bowen

แม้ว่าวิธีนี้จะใช้ได้ผล แต่ก็ยังไม่ได้รับการปรับให้เหมาะสมอย่างแท้จริงเนื่องจากคุณเสียเวลาในการคัดลอกสิ่งที่คุณจะลบ ฉันยังถือว่าขั้นตอนการสร้างก่อน / โพสต์เป็นแฮ็กเสมอเนื่องจากพวกเขาไม่ทำงานในระบบบิลด์มากกว่าเป้าหมายหรือไฟล์ proj
christ.s

ว้าว @ christ.s, * หัวเราะเบา ๆ * ฉันหวังว่าในสิบปีหลังจากที่ฉันตอบคำถามนี้ทีม Visual Studio จะทำให้สิ่งนี้ง่ายขึ้น :-)
AndrewJacksonZA

5

นี่เป็นคำถามที่ค่อนข้างเก่า แต่เนื่องจากไม่มีคำตอบเกี่ยวกับวิธีปิดการสร้างไฟล์ PDB และ XML ผ่าน UI ฉันจึงคิดว่าควรอยู่ที่นี่เพื่อความสมบูรณ์

ใน Visual Studio 2013: ในคุณสมบัติของโปรเจ็กต์ภายใต้แท็บคอมไพล์ให้ยกเลิกการเลือก "สร้างไฟล์เอกสาร XML" จากนั้นคลิกที่ "ตัวเลือกการคอมไพล์ขั้นสูง" ด้านล่างและเปลี่ยน "สร้างข้อมูลการแก้ไขข้อบกพร่อง" เป็น "ไม่มี" จากนั้นจะทำเคล็ดลับ


15
ซึ่งจะไม่มีผลกับแพ็คเกจ nuget ใด ๆ ที่คุณรวมไว้จะยังคงมีอยู่pdbและxmlไฟล์ต่างๆ
Lankymart

ฉันใช้คุณสมบัติ OctoPack ในไฟล์ csproj ของฉันและนี่เป็นเคล็ดลับสำหรับไฟล์ PDB และ XML ของฉัน ฉันใช้ VS 2015 ด้วยเช่นกัน Build -> Advanced ภายใต้ Output -> set Debug Info เป็น none ภายใต้ Output
Devin Prejean

0

คำตอบของฉันตอนนี้อาจเป็นเรื่องเล็กน้อย แต่ฉันต้องการแบ่งปันสคริปต์ BAT ที่ฉันใช้เพื่อลบไฟล์ xml หากมี 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 คนอื่น ๆ เช่นฉัน


0

ฉันไม่ได้โชคดีกับคำตอบอื่น ๆ ในที่สุดฉันก็ค้นพบวิธีการดำเนินการนี้ในการใช้งานของฉันโดยใช้คำสั่ง "ลบ" ในตัวซึ่งเห็นได้ชัดว่ามีวิธีเฉพาะที่คุณต้องใช้ในการใช้สัญลักษณ์แทนมัน ค่อนข้างเหมาะสมเล็กน้อยนี่คือ ทุกสิ่งที่คุณต้องใส่ลงใน "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>

-3

หากคุณต้องการยกเว้นไฟล์ XML เท่านั้น (สำหรับการบอกว่ารุ่นดีบัก) คุณสามารถทำสิ่งนี้ได้:

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

โดยทั่วไปแต่ละส่วนขยาย (คั่นด้วยเครื่องหมายอัฒภาค) ที่แสดงรายการจะไม่รวมอยู่ด้วย


1
คำถามและคำตอบที่ยอมรับนี้มีอายุ 4 ปีและคำตอบของคุณเกือบจะเป็นการคัดลอกและวางคำตอบที่ยอมรับ
Zack

1
สิ่งที่แตกต่างคือไวยากรณ์สำหรับไฟล์ XML ซึ่งเป็นสิ่งที่ฉันต้องการ ฉันต้องทำการวิจัยเพื่อหาไวยากรณ์ที่เหมาะสมของแท็กนี้ ฉันพบว่าคำตอบเดิมมีประโยชน์และได้รับการโหวต แต่คิดว่าฉันสามารถช่วยคนอื่นได้บ้างหากพวกเขาต้องการกรองไฟล์บางประเภท
ProVega

11
แต่จะไม่รวมไฟล์ xml หรือไม่ไม่รวมไว้
David Gardiner
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.