ความแตกต่างระหว่างการสร้างใหม่และ Clean + Build ใน Visual Studio


299

อะไรคือความแตกต่างระหว่างเพียงแค่การสร้างใหม่และการทำClean + Buildใน Visual Studio 2008 มีการทำความสะอาด + รูปร่างที่แตกต่างกันแล้วทำสะอาด + สร้าง ?


คำตอบ:


308

สร้างใหม่ = Clean + Build (โดยปกติ)

รายละเอียดที่น่าสังเกต:

  1. สำหรับโซลูชันที่มีหลายโครงการ "การสร้างโซลูชันใหม่" จะ "ทำความสะอาด" ตามด้วย "การสร้าง" สำหรับแต่ละโครงการ (อาจเป็นแบบขนาน) ในขณะที่ "วิธีการแก้ปัญหาที่สะอาด" ตามด้วย "การสร้างโซลูชัน" ก่อนทำความสะอาดทุกโครงการ (อาจขนาน) และสร้างโครงการทั้งหมด (อาจขนาน) ความแตกต่างในการเรียงลำดับเหตุการณ์สามารถกลายเป็นเรื่องสำคัญเมื่อการพึ่งพาระหว่างโครงการเข้ามามีบทบาท

  2. การกระทำทั้งสามสอดคล้องกับเป้าหมายของ MSBuild ดังนั้นโครงการสามารถแทนที่การดำเนินการ Rebuild เพื่อทำสิ่งที่แตกต่างอย่างสิ้นเชิง


2
ดังนั้นคุณจะบอกว่าสร้างใหม่จะว่าเช่นเดียวกับการทำความสะอาดตามด้วยการสร้าง ? นั่นคือสิ่งที่ฉันคิด แต่ฉันก็ไม่แน่ใจ
Jim McKeeth

43
ยกเว้นสร้างใหม่ล้างและสร้างใหม่แต่ละโครงการทีละ Clean + Build ล้างข้อมูลทั้งหมดแล้วสร้างทั้งหมด ทำให้ความแตกต่างส่วนใหญ่ถ้าคุณคลิกมันโดยบังเอิญ :)
ยู

25
ยกเว้นการขาดการรับประกันว่าพวกเขาเหมือนกัน ดูคำตอบของ JaredPar ด้านล่างซึ่งรวมกับ Earl's เป็นภาพรวมทั้งหมด เนื่องจากการสร้างใหม่ทำแต่ละโครงการในทางกลับกันคุณสามารถมี "มุมกรณี" เมื่อข้อมูลการพึ่งพาของคุณถูกทำให้ยุ่งเหยิงและคุณได้รับโครงการสร้างตามคำสั่งของ B โดยใช้โครงการเก่า A จากนั้นสร้างใหม่จากนั้นสร้าง C เป็นต้น การแก้ปัญหาแบบเต็มการล้างตามด้วยการสร้างโซลูชันแบบเต็มจะจับสถานการณ์นี้ในขณะที่การสร้างใหม่จะไม่ ดังนั้นยิ่งคุณหวาดระแวงและเหนื่อยล้ามากเท่าไหร่คุณก็จะยิ่งสะอาดมากขึ้นเท่านั้น
เจสันแฮร์ริสัน

14
นี่ไม่เป็นความจริง. ฉันมีโครงการที่ Clean + Build สำเร็จแล้วและ Rebuild คืนข้อผิดพลาดในการคอมไพล์ (อ้างอิงไฟล์แบบวงกลม) ดังนั้นพวกเขาจึงไม่เหมือนกัน 100%
Yaakov Ellis

2
อาจเป็นเพราะสิ่งที่โพสต์นี้มีการเปลี่ยนแปลง แต่มีคำอธิบายว่าทำไมการสร้างใหม่ไม่ได้ (ไม่อีกต่อไป?) เหมือนกับ clean + build stackoverflow.com/questions/3095901/…
เดฟ

163

Earl นั้นถูกต้องที่ 99% ของเวลาที่สร้างใหม่ = Clean + Build

แต่พวกเขาไม่รับประกันว่าจะเหมือนกัน การกระทำ 3 รายการ (สร้างใหม่สร้างใหม่ทั้งหมด) หมายถึงเป้าหมาย MSBuild ที่แตกต่างกัน ซึ่งแต่ละไฟล์สามารถถูกแทนที่ด้วยไฟล์โปรเจ็กต์เพื่อทำการกระทำที่กำหนดเอง ดังนั้นจึงเป็นไปได้สำหรับบางคนที่จะแทนที่การสร้างใหม่เพื่อดำเนินการหลายอย่างก่อนที่จะเริ่มต้นการสร้าง + การสร้างใหม่ทั้งหมด (หรือเพื่อลบทั้งหมด)

กรณีมุมมาก แต่ชี้ให้เห็นเนื่องจากการอภิปรายแสดงความคิดเห็น


หากคุณเพิ่มบิลด์แอ็คชันที่ย้ายไฟล์. dll ไปยังตำแหน่งใหม่คุณสามารถรับผลลัพธ์บิลด์ที่ 'ไม่ดี' โดยทำการสร้างใหม่ ถ้าคุณผสม vb.net และ c # โปรเจ็คให้แย่ยิ่งกว่าเดิมนักออกแบบฟอร์มที่เสียและไม่มีการทำงานเลย
CodingBarfield

+1 หมายเหตุด้วยว่าพฤติกรรมการสร้างใหม่ดูเหมือนจะไม่สอดคล้องกันในทุกภาษาที่เกี่ยวข้องกับการพึ่งพา: stackoverflow.com/questions/12163080//
lesscode

1
99% ของเวลาถูกประเมินค่าอย่างมหาศาล
Rhyous

58

มากำหนดการสร้าง Rebuild ที่เป็นค่าเริ่มต้นในแง่ของการใช้ Clean and Build ที่เป็นค่าเริ่มต้น:

  1. ต่อโครงการ: สร้างโครงการ = ล้างโครงการ + สร้างโครงการ

  2. วิธีแก้ปัญหา: สร้างใหม่ sln = foreach project ใน sln (ล้างโครงการ + สร้างโครงการ)

โปรดทราบว่าเนื่องจากความแตกต่างในลำดับของการดำเนินการ Rebuild sln ไม่เหมือนกับ (Clean sln + Build sln) = (โครงการ foreach ในโครงการ sln Clean project) + (โครงการ foreach ในโครงการ sln Build) นอกจากนี้ "foreach" นี้อาจทำงานพร้อมกันดังนั้นจึงอนุญาตให้ใช้งานที่แตกต่างกันในการทำงานพร้อมกันในสองสถานการณ์

สมมติว่าคุณมี sln ที่มี proj1, proj2 และ proj3

  • สร้าง sln = (Clean proj1 + Build proj1) & (Clean proj2 + Build proj2) & (Clean proj3 + Build proj3)

  • Clean Sln + Build Sln = (ทำความสะอาดผลิตภัณฑ์และล้าง proj2 และ Clean proj3) + (Build proj1 & Build proj2 & Build proj3)

+ หมายถึงอนุกรมและหมายถึงพร้อมกัน

ดังนั้นหากการอ้างอิงโครงการไม่ได้รับการกำหนดค่าอย่างถูกต้องมีโอกาสที่เมื่อคุณดำเนินการสร้างใหม่ sln บางโครงการของคุณเชื่อมโยงไปยัง lib เก่า นั่นเป็นเพราะการล้างทั้งหมดไม่ได้รับประกันว่าจะเสร็จก่อนที่จะเริ่มสร้างครั้งแรก หากคุณดำเนินการ Clean sln + Build sln พวกเขาจะให้ข้อผิดพลาดในการเชื่อมโยงและแจ้งให้คุณทราบทันทีแทนที่จะให้แอปที่มีพฤติกรรมแปลก ๆ


7
อันนี้เป็นคำตอบที่ถูกต้องที่สุดเพราะมันอธิบายว่าทำไมบางครั้งฉันไม่สามารถสร้างใหม่ได้ แต่ก็สามารถทำความสะอาด + สร้างได้
Toan Nguyen

11

จากhttp://www.cs.tufts.edu/r/graphics/resources/vs_getting_started/vs_getting_started.htm (เพิ่ง googled)

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

สร้างหรือสร้างโซลูชันใหม่สร้างหรือสร้างโครงการทั้งหมดในโซลูชันของคุณในขณะที่สร้างหรือสร้างใหม่สร้างหรือสร้างโครงการเริ่มต้นใหม่ "สวัสดี" ในภาพหน้าจอด้านบน ในการตั้งค่าโครงการเริ่มต้นให้คลิกขวาที่ชื่อโครงการที่ต้องการในแท็บโซลูชัน Explorer และเลือกตั้งเป็นโครงการเริ่มต้น ชื่อโครงการจะปรากฏเป็นตัวหนา เนื่องจากโดยทั่วไปโซลูชันการบ้านจะมีเพียงโครงการเดียวเท่านั้น Build หรือ Rebuild Solution จึงมีประสิทธิภาพเหมือนกับ Build หรือ Rebuild

คอมไพล์เพียงรวบรวมไฟล์ต้นฉบับที่กำลังแก้ไขอยู่ มีประโยชน์ในการตรวจสอบข้อผิดพลาดอย่างรวดเร็วเมื่อไฟล์ต้นฉบับส่วนที่เหลือของคุณอยู่ในสถานะไม่สมบูรณ์ซึ่งจะช่วยป้องกันการสร้างโครงการที่ประสบความสำเร็จทั้งหมด Ctrl-F7 เป็นปุ่มลัดสำหรับการคอมไพล์


เช่น Toan Nguyen ฉันเคยพบว่าบางครั้ง Clean + Build Solution ประสบความสำเร็จเมื่อ Rebuild Solution ล้มเหลว (อาจเป็นเพราะการพึ่งพาโครงการระหว่าง) ดังนั้นคำตอบนี้ทำให้เข้าใจผิดอย่างน้อยในปี 2018
Jon Coombs

4

จากโพสต์บล็อกนี้ซึ่งผู้เขียนเชื่อมโยงเป็นความคิดเห็นในคำถามนี้ :

ไม่จริง !!! พวกเขาไม่เท่ากัน

ความแตกต่างคือในลำดับโครงการทำความสะอาดและสร้าง สมมติว่าเรามีสองโครงการในโซลูชัน ทำความสะอาดแล้วสร้างจะดำเนินการทำความสะอาดกับทั้งสองโครงการแล้วสร้างจะเกิดขึ้นเป็นรายบุคคลในขณะที่โครงการสร้างใหม่จะได้รับและทำความสะอาดแล้วสร้างหลังจากโครงการ B จะสะอาดแล้วสร้างและอื่น ๆ

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