Sự khác biệt giữa Rebuild và Clean + Build trong Visual Studio


Câu trả lời:


308

Rebuild = Clean + Build (thường)

Chi tiết đáng chú ý:

  1. Đối với giải pháp đa dự án, "xây dựng lại giải pháp" thực hiện "làm sạch" theo sau là "xây dựng" cho từng dự án (có thể song song). Trong khi đó, một "giải pháp sạch" theo sau là "giải pháp xây dựng" trước tiên sẽ làm sạch tất cả các dự án (có thể song song) và sau đó xây dựng tất cả các dự án (có thể song song). Sự khác biệt này trong chuỗi các sự kiện có thể trở nên quan trọng khi các phụ thuộc giữa các dự án đi vào hoạt động.

  2. Tất cả ba hành động tương ứng với các mục tiêu MSBuild. Vì vậy, một dự án có thể ghi đè lên hành động Rebuild để làm một cái gì đó hoàn toàn khác.


2
Vì vậy, bạn đang nói rằng Rebuild được chính xác giống như một sạch theo sau là một xây dựng ? Đó là những gì tôi nghĩ, nhưng tôi không chắc.
Jim McKeeth

43
Ngoại trừ Rebuild dọn dẹp và xây dựng lại từng dự án một. Clean + Build làm sạch tất cả chúng và sau đó xây dựng tất cả chúng. Làm cho sự khác biệt chủ yếu là nếu bạn nhấp vào nó một cách tình cờ :)
Eugene

25
Ngoại trừ việc không đảm bảo rằng chúng giống nhau. Xem câu trả lời của JaredPar bên dưới, kết hợp với Earl's là toàn bộ bức tranh. Vì Rebuild thực hiện lần lượt từng dự án, bạn có thể có "trường hợp góc" khi thông tin phụ thuộc của bạn bị sai lệch và bạn nhận được một dự án xây dựng B trật tự bằng cách sử dụng dự án cũ A sau đó xây dựng lại A, sau đó xây dựng lại C. vv A giải pháp đầy đủ Làm sạch theo sau là xây dựng giải pháp đầy đủ sẽ nắm bắt được tình huống này trong khi việc xây dựng lại sẽ không xảy ra. Vì vậy, bạn càng hoang tưởng và mệt mỏi, bạn càng nên ưu tiên cho Clean rồi Build.
Jason Harrison

14
Đây không phải là sự thật. Tôi đã có một dự án trong đó Clean + Build đã thành công và Rebuild trả về các lỗi biên dịch (tham chiếu tệp tròn). Vì vậy, chúng không giống nhau 100%.
Yaakov Ellis

2
Có thể vì bài đăng này mọi thứ đã thay đổi, nhưng có một lời giải thích tại sao Rebuild không (không còn nữa?) Giống như dọn dẹp + xây dựng stackoverflow.com/questions/3095901/ Lỗi
Dave

163

Earl đúng là 99% thời gian Rebuild = Clean + Build.

Nhưng chúng không được đảm bảo giống nhau. 3 hành động (xây dựng lại, xây dựng, dọn dẹp) đại diện cho các mục tiêu MSBuild khác nhau. Mỗi trong số đó có thể được ghi đè bởi bất kỳ tệp dự án nào để thực hiện các hành động tùy chỉnh. Vì vậy, hoàn toàn có thể ai đó ghi đè lên việc xây dựng lại để thực hiện một số hành động trước khi bắt đầu xây dựng + sạch (hoặc xóa chúng hoàn toàn).

Rất nhiều trường hợp góc nhưng chỉ ra nó do các cuộc thảo luận bình luận.


Nếu bạn thêm các hành động xây dựng để di chuyển các tệp dll đến một vị trí mới, bạn có thể nhận được kết quả xây dựng 'xấu' chỉ bằng cách xây dựng lại. Nếu bạn kết hợp một dự án vb.net và c # thậm chí còn tệ hơn, các nhà thiết kế mẫu bị hỏng và không có goto làm việc.
CodingBarfield

+1 Cũng lưu ý rằng hành vi của Rebuild dường như không nhất quán giữa các ngôn ngữ liên quan đến sự phụ thuộc: stackoverflow.com/questions/12163080/
Kẻ

1
99% thời gian được đánh giá quá cao.
Rhyous

58

Hãy xác định triển khai Rebuild mặc định theo các triển khai Clean and Build mặc định:

  1. Mỗi dự án: Dự án xây dựng lại = Dự án sạch + Dự án xây dựng.

  2. Mỗi giải pháp: Rebuild sln = foreach project in sln (Dự án sạch + Dự án xây dựng).

Lưu ý rằng do sự khác biệt về thứ tự thực hiện, Rebuild sln không giống với (Clean sln + Build sln) = (dự án foreach trong dự án Sln Clean) + (dự án foreach trong dự án Sln Build). Ngoài ra, "foreach" này có thể thực thi đồng thời, vì vậy các tác vụ khác nhau được phép chạy đồng thời trong hai kịch bản.

Giả sử bạn có một sln chứa proj1, proj2 và proj3.

  • Rebuild sln = (Clean proj1 + Build proj1) & (Clean proj2 + Build proj2) & (Clean proj3 + Build proj3)

  • Clean Sln + Build Sln = (Clean proj1 & Clean proj2 & Clean proj3) + (Build proj1 & Build proj2 & Build proj3)

+ có nghĩa là nối tiếp, & có nghĩa là đồng thời.

Vì vậy, nếu các phụ thuộc dự án không được cấu hình đúng, có thể khi bạn thực hiện Rebuild sln, một số dự án của bạn liên kết đến một lib cũ. Đó là bởi vì tất cả các hoạt động dọn dẹp không được đảm bảo hoàn thành trước khi quá trình xây dựng đầu tiên bắt đầu. Nếu bạn thực hiện Clean sln + Build sln, họ sẽ đưa ra lỗi liên kết và cho bạn biết điều đó ngay lập tức, thay vì cung cấp cho bạn một ứng dụng có hành vi kỳ quặc.


7
Đây là câu trả lời chính xác nhất, vì nó giải thích tại sao đôi khi tôi không thể xây dựng lại, nhưng đã có thể dọn dẹp + xây dựng.
Toàn Nguyễn

11

Từ http://www.cs.tufts.edu/r/graphics/resource/vs_getting_started/vs_getting_started.htmlm , (chỉ cần googled nó):

Build có nghĩa là biên dịch và chỉ liên kết các tệp nguồn đã thay đổi kể từ lần xây dựng trước, trong khi Rebuild có nghĩa là biên dịch và liên kết tất cả các tệp nguồn bất kể chúng có thay đổi hay không. Xây dựng là điều bình thường để làm và nhanh hơn. Đôi khi các phiên bản của các thành phần mục tiêu dự án có thể không đồng bộ hóa và xây dựng lại là cần thiết để xây dựng thành công. Trong thực tế, bạn không bao giờ cần phải làm sạch.

Build hoặc Rebuild Solution xây dựng hoặc xây dựng lại tất cả các dự án trong giải pháp của bạn, trong khi Build hoặc Rebuild xây dựng hoặc xây dựng lại dự án StartUp, "xin chào" trong ảnh chụp màn hình ở trên. Để đặt dự án StartUp, nhấp chuột phải vào tên dự án mong muốn trong tab Solution Explorer và chọn Đặt làm dự án StartUp. Tên dự án bây giờ xuất hiện in đậm. Vì các giải pháp bài tập về nhà thường chỉ có một dự án, Build hoặc Rebuild Solution thực sự giống như Build hoặc Rebuild.

Biên dịch chỉ biên dịch tệp nguồn hiện đang được chỉnh sửa. Hữu ích để nhanh chóng kiểm tra lỗi khi phần còn lại của tệp nguồn của bạn ở trạng thái không hoàn chỉnh sẽ ngăn việc xây dựng thành công toàn bộ dự án. Ctrl-F7 là phím tắt cho Biên dịch.


Giống như Toàn Nguyễn, tôi đã trải nghiệm rằng đôi khi Giải pháp sạch + xây dựng thành công khi Giải pháp xây dựng lại thất bại (có thể do phụ thuộc giữa các dự án), vì vậy câu trả lời này là sai lệch, ít nhất là vào năm 2018.
Jon Coombs

4

Từ bài đăng trên blog này mà tác giả đã liên kết như một nhận xét về câu hỏi này :

Thật ra là không !!! chúng không bằng nhau

Sự khác biệt là trong các dự án trình tự được làm sạch và xây dựng. Hãy nói rằng chúng tôi có hai dự án trong một giải pháp. Làm sạch và sau đó xây dựng sẽ thực hiện sạch cho cả hai dự án và sau đó xây dựng sẽ xảy ra riêng lẻ trong khi xây dựng lại dự án A sẽ nhận được và làm sạch và sau đó xây dựng sau dự án B đó sẽ sạch sẽ và sau đó xây dựng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.