ความแตกต่างระหว่าง Build Solution, Rebuild Solution และ Clean Solution ใน Visual Studio หรือไม่?


1137

อะไรคือความแตกต่างระหว่างบิลด์โซลูชั่น, บิวด์โซลูชั่นและคลีนโซลูชั่นใน Visual Studio?

เวลาที่เหมาะสมในการใช้แต่ละรายการเหล่านี้คือเมื่อใด




2
สร้างใหม่เหมือนกับ clean แล้ว build หรือไม่?
พันเอก Panic

@ColonelPanic ใช่
Alan Birtles

คำตอบ:


921
  • โซลูชันบิลด์จะดำเนินการบิลด์เพิ่มเติม: หากไม่คิดว่าจะต้องสร้างโครงการใหม่ มันอาจใช้บิตที่สร้างขึ้นบางส่วนของโครงการหากพวกเขาไม่ได้เปลี่ยน (ฉันไม่รู้ว่าใช้เวลานานแค่ไหน)
  • สร้างโซลูชันใหม่จะทำความสะอาดแล้วสร้างโซลูชันตั้งแต่เริ่มต้นโดยไม่สนใจสิ่งที่เคยทำมาก่อน ความแตกต่างระหว่างสิ่งนี้กับ "ล้างแล้วตามด้วย Build" คือการสร้างใหม่จะล้างแล้วสร้างแต่ละโครงการทีละโครงการแทนที่จะล้างทั้งหมดแล้วสร้างทั้งหมด
  • วิธีแก้ปัญหาแบบสะอาดจะลบส่วนสร้างออกจากรุ่นก่อนหน้า หากมีไฟล์อื่นในไดเร็กทอรีปลายทางบิลด์ (bin และ obj) ไฟล์เหล่านั้นอาจไม่ถูกลบ แต่ส่วนบิลด์ส่วนต่อท้ายที่แท้จริงคือ ฉันเคยเห็นพฤติกรรมของการเปลี่ยนแปลงนี้ - บางครั้งการลบอย่างทั่วถึงและบางครั้งก็ไม่ - แต่ฉันจะให้ประโยชน์กับข้อสงสัยในขณะนี้ :)

(ลิงก์ไปยังสวิตช์บรรทัดคำสั่งdevenv.exeแต่ทำเช่นเดียวกับรายการเมนู)


2
@womp: ไม่ได้อยู่ในโครงการฉันเพิ่งได้ดู ยังคงมีชุดประกอบทั้งหมดอยู่ที่นั่น ...
Jon Skeet

1
@ จอน - แปลก ฉันจำไม่ได้ว่าสะอาดไม่เคยทำความสะอาดไดเรกทอรีเหล่านั้น ฉันกำลังทำอยู่ตอนนี้และมันจะทำการลบไฟล์. dll และ. pdb ทั้งหมด แน่นอนทิ้ง ReSharper ของฉันไว้คนเดียว
womp

156
ฉันพบว่า "วิธีแก้ปัญหาที่สะอาด" เป็นการส่วนตัวที่ไม่ช่วยเหลือ ถ้าฉันต้องการทำความสะอาดจริงๆการลบโฟลเดอร์ bin และ obj ด้วยตนเองคือวิธีที่จะไป แม้ถูกจับไล่ "ข้อผิดพลาด" ผี - จนกว่าฉันจะทำอย่างนั้น การทำความสะอาดไม่น่าเชื่อถือ
Chris Rogers

7
หากสิ่งประดิษฐ์ทำทางของพวกเขาผ่านวิธีอื่นนอกเหนือจากการสร้างสิ่งประดิษฐ์ (พูดเช่นสำเนาจากแหล่งอื่นที่รวมเป็น msbuidltask ใน cproj) จากนั้นทำความสะอาดออกจากพวกเขา ซึ่งทำให้มันไร้ประโยชน์มากทีเดียวฉันยังบอกด้วยว่ามันอันตรายเพราะมันจะทำให้คุณรู้สึกสะอาด
Newtopian

4
@verdana: สำหรับ github ฯลฯ มันง่ายกว่าที่จะมี.gitignoreไฟล์ที่ดี แต่ตามคำตอบแล้ว Clean ไม่ได้ทำงานที่ละเอียดรอบคอบเป็นพิเศษในประสบการณ์ของฉัน
Jon Skeet

455

สร้างโซลูชัน: รวบรวมไฟล์รหัส (DLL และ EXE) ซึ่งมีการเปลี่ยนแปลง

สร้างใหม่: ลบไฟล์ที่รวบรวมทั้งหมดและรวบรวมอีกครั้งโดยไม่คำนึงว่ารหัสมีการเปลี่ยนแปลงหรือไม่

วิธีแก้ไขปัญหาทั้งหมด: ลบไฟล์ที่รวบรวมทั้งหมด (ไฟล์ DLL และ EXE)

คุณสามารถดูวิดีโอ YouTube นี้ ( Visual Studio Build vs. Rebuild vs. Clean (คำถามสัมภาษณ์ C # พร้อมคำตอบ) ) ที่ฉันได้แสดงให้เห็นถึงความแตกต่างและด้านล่างคือการแสดงด้วยภาพซึ่งจะช่วยให้คุณวิเคราะห์ในรายละเอียดมากขึ้น

สร้าง vs สร้างใหม่

ความแตกต่างระหว่าง Rebuild vs. (Clean + Build) เนื่องจากดูเหมือนว่าจะมีความสับสนเกี่ยวกับเรื่องนี้เช่นกัน:

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

แต่ถ้าคุณทำ "สะอาด" และสร้าง "มันจะลบไฟล์ที่คอมไพล์แล้วทั้งหมดสำหรับ" proj1 "และ" proj2 "จากนั้นจะสร้าง" proj1 "ก่อนตามด้วย" proj2 "

สร้าง Vs Clean ใหม่


26
ขอบคุณสำหรับการอธิบายว่าทำไมการสร้างใหม่ไม่ได้ผลเสมอไปและฉันต้องทำความสะอาดก่อนทำบิลด์
Didier A.

4
ใช่คำอธิบายและแผนภาพที่สองมีประโยชน์และชัดเจนมาก หากคุณสามารถแก้ไขผังงาน "ผิดกฎหมาย" เพื่อให้ใช่ไปที่เดียวเท่านั้นนั่นจะช่วยได้ ฉันไม่สามารถเข้าใจสิ่งที่คนพยายามพูดโดยเฉพาะกับ "Build ALL" ภายใต้ "สร้างใหม่"
Jon Coombs

@ JonCoombs ใช่ฉันไม่คิดว่าผังงานแรกจับสิ่งที่เขาพูดในวิดีโอ ฉันคิดว่าภาพที่ฉันใส่ไว้คือสิ่งที่ชิวาปราสเล็ง
ruffin

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

147

นำมาจากลิงค์นี้ :

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



1
Link? ฉันคิดว่าความคิดของ DLL หรือที่เรียกว่า Dynamic Link Library คือการลิงก์ที่รันไทม์?
Dag

7
"ในทางปฏิบัติคุณไม่จำเป็นต้องล้าง" <- ฉันเรียก BS ในอันนี้
piers7

2
piers7 คุณสามารถให้เหตุผลที่คุณจะต้องทำความสะอาด vs สร้างใหม่หรือไม่?
PaulBinder


46

สร้างโซลูชัน - สร้างชุดประกอบใด ๆ ที่มีการเปลี่ยนแปลงไฟล์ หากชุดประกอบไม่มีการเปลี่ยนแปลงชุดประกอบนั้นจะไม่ถูกสร้างใหม่ จะไม่ลบไฟล์กลางใด ๆ

ใช้กันมากที่สุด

สร้างโซลูชันใหม่ - สร้างแอสเซมบลีทั้งหมดโดยไม่คำนึงถึงการเปลี่ยนแปลง แต่ทิ้งไฟล์ระดับกลางไว้

ใช้เมื่อคุณสังเกตเห็นว่า Visual Studio ไม่ได้รวมการเปลี่ยนแปลงของคุณในแอสเซมบลีล่าสุด บางครั้ง Visual Studio ทำผิดพลาด

Clean Solution - ลบไฟล์ระดับกลางทั้งหมด

ใช้เมื่อทุกอย่างล้มเหลวและคุณต้องทำความสะอาดทุกอย่างและเริ่มต้นใหม่


25
ทำความสะอาดไม่ได้สร้าง
Jon Skeet

3
@Jon Skeet - เรียนรู้สิ่งใหม่ทุกวัน ฉันจะสาบานว่าจะสร้างใหม่ ฉันเดาว่าความทรงจำของฉันไม่น่าเชื่อถือเท่าที่ฉันต้องการ
Justin Niessner

16

ฉันคิดว่าการสร้างใหม่เป็นการแสดงบน Clean ก่อนตามด้วย Build บางทีฉันผิด ... ความเห็น?


สิ่งนี้ไม่มี upvotes (จนถึงตอนนี้) และตามเอกสาร (ดูลิงก์ในคำตอบของ Jon) สิ่งนี้ถูกต้องแน่นอน
ท็อด

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

@Cthutu ดูคำตอบของ Shivprasad สำหรับรายละเอียดที่สร้างความแตกต่างได้ที่นี่ สร้างการล้างอีกครั้งและสร้างแต่ละโครงการในแต่ละครั้งในขณะที่การเรียกใช้คลีนจะล้างข้อมูลทุกอย่างในครั้งเดียวจากนั้นสร้าง Build ทั้งหมดในครั้งเดียว ฉันทำงานข้ามอินสแตนซ์ที่การเปลี่ยนแปลงในคำสั่ง clean / build สร้างความแตกต่างระหว่างการคอมไพล์และไม่คอมไพล์
ฌอน

@Sean บางทีอาจเกิดจากการเพิ่มโครงการในโซลูชันของคุณfile referenceแทนproject referenceคำสั่ง build build ของโครงการที่ไม่รู้จักว่าจะต้องสร้างโครงการก่อนหน้าอื่นและชุดประกอบไม่มีอยู่ในที่ที่ควรมีในระหว่าง สร้าง?
Zack

14

สร้างโซลูชัน - สร้างชุดประกอบใด ๆ ที่มีการเปลี่ยนแปลงไฟล์ หากชุดประกอบไม่มีการเปลี่ยนแปลงชุดประกอบนั้นจะไม่ถูกสร้างใหม่ จะไม่ลบไฟล์กลางใด ๆ

สร้างโซลูชันใหม่จะทำความสะอาดแล้วสร้างโซลูชันตั้งแต่เริ่มต้นโดยไม่สนใจสิ่งที่เคยทำมาก่อน

Clean Solutionจะลบไฟล์ที่คอมไพล์ทั้งหมด (เช่น EXE's และ DLL) จากไดเร็กทอรี bin / obj


8

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


6

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

โซลูชันการสร้างใหม่ - โซลูชันการสร้างใหม่จะสร้างแอปพลิเคชันทั้งหมดของคุณด้วยการสร้างโครงการทั้งหมดที่มีอยู่ในโซลูชันของคุณพร้อมการทำความสะอาด ก่อนสร้างจะล้างไฟล์ไบนารีทั้งหมดออกจากโฟลเดอร์ bin และ obj

Clean Solution - โซลูชันสะอาดเป็นเพียงการล้างไฟล์ไบนารีทั้งหมดจากโฟลเดอร์ bin และ obj


5

สร้างโซลูชัน

สิ่งนี้จะดำเนินการสร้างที่เพิ่มขึ้น กล่าวอีกนัยหนึ่งมันจะสร้างไฟล์รหัสที่มีการเปลี่ยนแปลงเท่านั้น หากพวกเขาไม่ได้เปลี่ยนไฟล์เหล่านั้นจะไม่ได้สัมผัส

สร้างโซลูชันใหม่

วิธีนี้จะลบไฟล์ที่รวบรวมในปัจจุบันทั้งหมด (เช่น exe และ DLL) และจะสร้างทุกอย่างตั้งแต่เริ่มต้นโดยไม่คำนึงว่ามีการเปลี่ยนแปลงรหัสในไฟล์หรือไม่

เมนูโซลูชั่นที่สะอาด

เมนูนี้จะลบไฟล์ที่คอมไพล์แล้วทั้งหมด (เช่น EXE's และ DLL) จากไดเร็กทอรี bin / obj

สร้างใหม่ = ล้าง + สร้าง


4

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

ล้างจะลบเฉพาะไฟล์ (และล้าง) และ / หรือไดเรกทอรีที่ Visual Studio หรือคอมไพเลอร์เองสร้างขึ้นจริง หากคุณคัดลอกไฟล์หรือโครงสร้างไฟล์ / โฟลเดอร์ของคุณเองถูกสร้างขึ้นจากเครื่องมือหรือแหล่งข้อมูลภายนอก Visual Studio จะไม่ "รู้ว่ามีอยู่" ดังนั้นจึงไม่ควรแตะต้องมัน

คุณสามารถจินตนาการได้หรือไม่ว่าการดำเนินการ Clean โดยทั่วไปใช้ "del *. *"? นี่อาจเป็นความหายนะ

บิลด์ทำการคอมไพล์ในโครงการที่เปลี่ยนแปลงหรือจำเป็น

การสร้างใหม่ดำเนินการรวบรวมโดยไม่คำนึงถึงการเปลี่ยนแปลงหรือสิ่งที่จำเป็น

ล้างจะลบไฟล์ / โฟลเดอร์ที่สร้างไว้ในอดีต แต่ทิ้งสิ่งที่ไม่ได้ทำไว้ก่อน

ฉันหวังว่าสิ่งนี้จะช่วยอธิบายเล็กน้อยและช่วย


4

ผมมีทางออกว่างเปล่า AA BuildRebuildCleanและห้องสมุดชั้นสามModels, ,RepositoryNotification

ฉันใช้ModelsและRepositoryในNotificationไลบรารีของชั้นเรียน

แล้ว:

  • สร้างโซลูชันบิลด์ที่เพิ่มขึ้นและคอมไพล์เฉพาะไฟล์ที่มีการเปลี่ยนแปลง หากชุดประกอบไม่มีการเปลี่ยนแปลงชุดประกอบนั้นจะไม่ถูกสร้างใหม่ และจะไม่ลบไฟล์กลางใด ๆ หากแก้ไขโค้ดบางส่วนในModelsโครงการห้องสมุดดังนั้น BUILD solution ในภาพหน้าจอด้านล่างอ้างถึงการประทับเวลาของ DLL, EXE ได้รับการปรับปรุงModelsและNotificationไลบรารี

ป้อนคำอธิบายรูปภาพที่นี่

  • สร้างโซลูชันใหม่ลบไฟล์ที่รวบรวมทั้งหมดและรวบรวมโดยไม่คำนึงถึงการเปลี่ยนแปลงโดยไม่สนใจสิ่งที่เคยทำมาก่อน BuildRebuildCleanคลิกขวาที่ชื่อการแก้ปัญหา สิ่งที่ทำคือลบแอสเซมบลีทั้งหมด EXE และไฟล์ที่อ้างอิงเพื่อรวบรวมอีกครั้ง

ป้อนคำอธิบายรูปภาพที่นี่

  • Clean Solution ลบไฟล์ระดับกลางที่คอมไพล์แล้วทั้งหมด (เช่น EXEs และ DLL) จากไดเรกทอรี bin / obj

ป้อนคำอธิบายรูปภาพที่นี่


2

ทั้งหมดที่ฉันรู้คือการทำความสะอาดไม่ได้ทำในสิ่งที่ "ทำให้สะอาด" เคยทำ - ถ้าฉันทำความสะอาดวิธีการแก้ปัญหาฉันคาดหวังว่ามันจะลบไฟล์ / โฟลเดอร์ obj และ bin เช่นที่มันสร้างเหมือนเป็นเช็คเอาต์สดของแหล่งที่มา จากประสบการณ์ของฉันแม้ว่าฉันมักจะพบเวลาที่ Clean and Build หรือ Rebuild ยังคงสร้างข้อผิดพลาดแปลก ๆ ในแหล่งที่ทราบว่ารวบรวมและสิ่งที่จำเป็นคือการลบโฟลเดอร์ bin / obj ด้วยตนเองจากนั้นจะสร้าง


พิเศษในโครงการ Xamarin ฉันต้องลบ bin ด้วยตนเองและโฟลเดอร์ obj เพื่อแก้ไขข้อผิดพลาดการรวบรวมแปลก
มิเกล Febres

1

สร้างโซลูชันสร้างเฉพาะโครงการที่มีการเปลี่ยนแปลงในโซลูชันและไม่มีผลต่อแอสเซมบลีที่ไม่เปลี่ยนแปลง

ทำความสะอาด ReBuild ก่อนประกอบทั้งหมดจากการแก้ปัญหาแล้วสร้างโซลูชั่นทั้งหมดโดยไม่คำนึงถึงการเปลี่ยนแปลงที่ทำ

ทำความสะอาดเพียงล้างสารละลาย



0

สิ่งนี้เกี่ยวข้องกับตัวเลือก "สร้างโซลูชัน" เท่านั้น

ฉันเบื่อหน่ายโดยสิ้นเชิงกับ Visual Studio ที่ไม่สามารถแก้ปัญหาได้อย่างแท้จริงและเขียนเครื่องมือเล็ก ๆ นี้ที่จะทำเพื่อคุณ

ปิดโซลูชันของคุณใน VS ก่อนแล้วลากโฟลเดอร์จาก Windows Explorer ไปยังแอพนี้หรือไปที่ไอคอน ขึ้นอยู่กับการตั้งค่าที่ด้านล่างของหน้าต่างมันสามารถลบสิ่งเพิ่มเติมที่จะช่วยถ้าคุณพยายามอัปโหลดโซลูชันของคุณไปที่ GitHub ด้วยตนเองหรือแชร์กับคนอื่น:

ป้อนคำอธิบายรูปภาพที่นี่

โดยสรุปแล้วมันจะวางโฟลเดอร์ "Debug" ทั้งหมด Intellisense และแคชอื่น ๆ ที่สามารถสร้างใหม่โดย VS ลงใน Recycle Bin ให้คุณ

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