2009-02-20 33 views
29

Tôi có một dự án C# bao gồm một tệp exe và 11 thư viện. Exe tham khảo tất cả các thư viện và lib1 có thể tham chiếu đến lib2, lib3, lib4, v.v.Visual Studio 2008 Dự án không cần thiết của dự án

Nếu tôi thay đổi một lớp trong lib1 và xây dựng giải pháp, tôi giả định rằng chỉ lib1 và exe sẽ cần đã thay đổi. Tuy nhiên, tất cả dll và exe đang được xây dựng nếu tôi muốn chạy giải pháp.

Có cách nào để tôi có thể ngăn chặn các phụ thuộc không được xây dựng nếu chúng chưa bị thay đổi không?

+0

Đây có phải là khi bạn đang tích cực phát triển và gỡ lỗi hoặc là một phần của một xây dựng kịch bản? Đối với người đầu tiên, điều này là có thể với các cài đặt phù hợp. Đối với thứ hai, nó không dễ dàng làm được. – jeremcc

+0

Đây là lúc tôi đang tích cực phát triển/gỡ lỗi. –

+0

Nếu bạn "Xây dựng Giải pháp", liệu nó có xây dựng tất cả các dự án hay chỉ những dự án đã được sửa đổi (hoặc một sự phụ thuộc đã được)? –

Trả lời

48

Khóa có phải là cụm từ này không? "Tuy nhiên, tất cả các dll và exe đang được xây dựng nếu tôi muốn chạy các giải pháp"

Visual Studio sẽ luôn cố gắng để xây dựng tất cả mọi thứ khi bạn chạy một dự án duy nhất, ngay cả khi dự án mà không phụ thuộc trên tất cả mọi thứ. Sự lựa chọn này có thể được thay đổi, tuy nhiên. Đi đến Công cụ | Tùy chọn | Dự án và Giải pháp | Xây dựng và Chạy và chọn hộp "Chỉ xây dựng dự án khởi động và phụ thuộc vào Chạy". Sau đó, khi bạn nhấn F5, VS sẽ chỉ xây dựng dự án khởi động của bạn và các DLL mà nó phụ thuộc vào.

+4

Dường như nó không có tác dụng khi bạn Xây dựng giải pháp (ví dụ: Ctrl + Shift + B) - nó vẫn biên dịch các dự án không thay đổi. – RobS

+1

+1 Bạn chỉ cần cạo 5 phút để kiểm tra mã lần lượt :) –

+0

Rob - Nó sẽ luôn quét các dự án để xem chúng có thay đổi hay không, và đưa đầu ra vào bản dựng cho biết nó đã làm như vậy, nhưng không nên được biên dịch lại chúng. Nếu có, bạn có thể muốn kiểm tra các nhiệm vụ trước hoặc sau khi xây dựng ở nơi khác để chắc chắn rằng chúng không kích hoạt các thay đổi trong các phụ thuộc của bạn. –

4

Bạn có thể bỏ chọn tùy chọn xây dựng cho các dự án quy định tại Solution configuration của bạn:

SolutionProperties http://i.msdn.microsoft.com/Bb166577.vsSolutionCfg(en-us,VS.90).gif

Bạn có thể có thể tạo cấu hình giải pháp của riêng bạn để xây dựng cấu hình dự án cụ thể ...

build config http://i.msdn.microsoft.com/Bb166577.vsConfigManager(en-us,VS.90).gif

+0

Tôi vẫn muốn dự án xây dựng nếu nó đã thay đổi. Điều này sẽ không xây dựng dự án nếu nó đã thay đổi. Cảm ơn mặc dù! –

0

Tôi không nghĩ rằng có đi để bạn có thể làm điều đó ra khỏi hộp trong VS. Bạn cần bổ trợ này http://workspacewhiz.com/

Nó không miễn phí nhưng bạn có thể đánh giá nó trước khi mua.

0

Có, loại trừ các bit không thay đổi khỏi giải pháp. Tôi nói điều này với một caveat, như bạn có thể biên dịch trong một cách mà một sự thay đổi trong số xây dựng cho lib thay đổi có thể gây ra các mảnh không được xây dựng để phá vỡ. Đây không phải là trường hợp, miễn là bạn không phá vỡ giao diện, nhưng nó là khá phổ biến bởi vì hầu hết các dev không hiểu giao diện trong thế giới .NET. Nó xuất phát từ việc không phải viết IDL. :-)

Đối với X projcts trong một giải pháp, KHÔNG, bạn không thể ngăn họ xây dựng, vì hệ thống thấy sự phụ thuộc đã thay đổi.

BTW, bạn nên xem dự án của mình và tìm hiểu lý do tại sao dự án giao diện người dùng của bạn (giả sử là giao diện người dùng) tham chiếu cùng một thư viện với mọi thứ khác. Mô hình phụ thuộc tốt sẽ hiển thị các lớp cần được chia ra làm đối tượng dữ liệu hoặc đối tượng miền (tôi đã giả định rằng sự phụ thuộc chung là một số loại đối tượng dữ liệu hoặc đối tượng miền, tất nhiên, nhưng điều đó khá phổ biến). Nếu sự phụ thuộc chung không phải là một đối tượng miền/dữ liệu, thì tôi sẽ suy nghĩ lại kiến ​​trúc của mình trong hầu hết các trường hợp. Nói chung, bạn sẽ có thể tạo một đường dẫn từ giao diện người dùng đến dữ liệu mà không có các phụ thuộc chung khác với các đối tượng không phải hành vi.

2

Bây giờ, sau khi tôi nói điều này, một số cánh quạt sẽ đi cùng và mâu thuẫn với tôi, nhưng không có cách nào để làm những gì bạn muốn làm từ Visual Studio. Có một cách để làm điều đó bên ngoài VS, nhưng trước tiên, tôi có một câu hỏi:

Tại sao bạn muốn làm điều này? Có thể bạn đang cố gắng tiết kiệm chu kỳ CPU, hoặc tiết kiệm thời gian biên dịch, nhưng nếu bạn làm những gì bạn đang gợi ý bạn sẽ đột nhiên thấy mình ở một vị trí tuyệt vời để tự bắn mình vào chân. Nếu bạn có thư viện 1 phụ thuộc vào thư viện 2, và chỉ có 2 thư viện thay đổi, bạn có thể nghĩ rằng bạn chỉ có thể xây dựng thư viện đã thay đổi, nhưng một trong những ngày này bạn sẽ thực hiện thay đổi đối với thư viện 2 sẽ phá vỡ thư viện 1, và không xây dựng thư viện 2, bạn sẽ không bắt được nó trong quá trình biên dịch. Vì vậy, theo ý kiến ​​khiêm tốn của tôi, KHÔNG LÀM VIỆC.

Lý do điều này sẽ không hoạt động trong VS2005 và 2008 là do VS sử dụng MSBuild. MSBuild chạy với các tệp dự án và nó sẽ kiểm tra các tham chiếu của dự án và xây dựng tất cả các dự án được tham chiếu trước, nếu nguồn của chúng đã thay đổi, trước khi xây dựng dự án đích. Bạn có thể tự kiểm tra điều này bằng cách chạy MSBuild từ dòng lệnh đối với một dự án không thay đổi nhưng với một dự án được tham chiếu đã thay đổi. Ví dụ:

msbuild ClassLibrary4.csproj

nơi ClassLibrary4 vẫn không thay đổi, nhưng nó tham chiếu ClassLibrary5, mà đã thay đổi. MSBuild sẽ xây dựng lib 5 trước tiên, trước khi nó xây dựng 4, ngay cả khi bạn không đề cập đến 5.

Cách duy nhất để có được tất cả các failafes này là sử dụng trình biên dịch trực tiếp thay vì đi qua MSBuild. Xấu xí, xấu xí, nhưng đó là nó. Về cơ bản, bạn sẽ được giảm xuống để triển khai lại MSBuild dưới một dạng nào đó để thực hiện những gì bạn muốn làm.

Nó không đáng đâu.

+4

Từ ví dụ của bạn, tôi không có vấn đề gì với hệ thống xây dựng để xây dựng "thư viện 1" nếu thay đổi "thư viện 2". Tôi có vấn đề với việc thay đổi "thư viện 1" và xây dựng hệ thống tự động xây dựng "thư viện 2" (mặc dù thư viện 2 và bất kỳ phụ thuộc của nó đã không thay đổi). –

+0

Bạn có chắc chắn rằng bạn không nhấp vào Xây dựng lại thay vì Xây dựng? Tôi không nhận được hành vi mà bạn đang báo cáo. Khi tôi mod thư viện 1, hệ thống không xây dựng thư viện 2 nếu không có thay đổi. Xây dựng lại xây dựng mọi thứ bất kể, nhưng Xây dựng không nên. – Cyberherbalist

+3

Tôi đang gặp vấn đề tương tự như Brad Leach và vì vậy là phần còn lại của nhóm phát triển của tôi .. Giải pháp duy nhất chúng tôi tìm thấy hoạt động là xây dựng với cấu hình nền tảng cụ thể. – RobS

4

Chúng tôi thực sự gặp sự cố này trong dự án hiện tại của mình, trong trường hợp của chúng tôi thậm chí chạy thử nghiệm đơn vị (không có bất kỳ thay đổi mã nào) đã khiến biên dịch lại. Kiểm tra "Nền tảng" của cấu hình xây dựng của bạn.

Nếu bạn đang sử dụng "CPU bất kỳ" thì vì lý do nào đó, nó xây dựng lại tất cả các dự án bất kể thay đổi. Hãy thử sử dụng các công cụ xây dựng bộ xử lý cụ thể, tức là x86 hoặc x64 (sử dụng nền tảng dành riêng cho kiến ​​trúc máy của máy của bạn). Làm việc cho chúng tôi để xây dựng x86.

alt text http://labs.episerver.com/Global/xmlrpc/111856/2008/06/24/image_26.png

4

Chúng tôi đã gặp sự cố tương tự khi làm việc. Trong các sự kiện hậu xây dựng, chúng tôi đã nhúng các tệp kê khai vào các kết quả đầu ra trong thư mục bin theo cách thủ công. Visual Studio đã sao chép các tham chiếu dự án từ thư mục obj (không được sửa đổi). Dấu thời gian khác nhau đã kích hoạt các bản dựng lại không cần thiết.

Nếu sự kiện sau xây dựng của bạn sửa đổi kết quả đầu ra của dự án thì hãy sửa đổi kết quả đầu ra trong thùng và thư mục obj HOẶC sao chép kết quả đã sửa đổi trong thư mục bin trên đầu trang của thư mục obj.

0

Không chắc chắn một cách tuyệt vời để xử lý việc này, nhưng trước đây nếu tôi có một hoặc hai dự án tiếp tục được xây dựng lại và giả sử tôi sẽ không làm việc với họ, tôi sẽ tắt quy trình xây dựng cho họ .

Nhấp chuột phải vào sln, chọn trình quản lý cấu hình và bỏ chọn các hộp kiểm. Không hoàn hảo, nhưng hoạt động khi Visual Studio không hoạt động.

1

Kiểm tra following site để biết thêm thông tin chi tiết về thời điểm dự án được xây dựng cũng như sự khác biệt giữa xây dựng và xây dựng lại.

+1

Tôi đồng ý với Chris. Nếu bạn nói "xây dựng lại" bạn có nghĩa là "xây dựng lại điều này ngay cả khi nó không có vẻ cần nó". Nếu bạn "xây dựng", thì các dự án đã được xây dựng sẽ bị bỏ qua. – MatthewMartin

+0

Vấn đề là "xây dựng" hoạt động như "xây dựng lại". Tôi cũng đã thấy hành vi này trên các dự án khác. –

+1

Từ trang web bạn đã liên kết tới: "Chưa xác định đã nói ... Rất vui khi tôi tìm thấy bài viết này. Tôi vừa cài đặt VS8 mới và khi tôi chọn Xây dựng, nó luôn xây dựng lại tất cả các dự án của tôi, ngay cả khi không có gì thay đổi. có bất kỳ ý tưởng gì để xem xét? Cùng một sln/dự án không làm điều này đang chạy trong .NET 2003. [email protected] " Đây là những gì tôi đang trải nghiệm !! Quy tắc của bạn, "Nếu bạn" xây dựng ", thì các dự án đã được xây dựng sẽ bị bỏ qua"., Trong khi về mặt lý thuyết, thì không chính xác trong những trường hợp này. –

1

Tôi có vấn đề này quá, và nhận thấy những thông điệp cảnh báo khi xây dựng trên Windows 7 x64, VS2008 SP1:

cl: Command cảnh báo dòng D9038:/ZI không được hỗ trợ trên nền tảng này; bật/Zi thay vì

cl: Cảnh báo dòng lệnh D9007: '/ Gm' yêu cầu '/ Zi'; tùy chọn bỏ qua

tôi đã thay đổi tính chất dự án của tôi để:

C/C++ -> General -> Format Thông tin Debug =/Zi

C/C++ -> Mã Generation -> Enable xây dựng tối thiểu = Không

Sau khi xây dựng lại, tôi đã chuyển chúng trở lại và phụ thuộc hoạt động tốt trở lại. Nhưng trước đó không có số lượng làm sạch, xây dựng lại, hoặc hoàn toàn xóa thư mục đầu ra sẽ sửa chữa nó.

+0

2010-06-23 - Nó xảy ra một lần nữa và lật chuyển đổi/Zi là đủ để sửa chữa nó. Làm sạch đầu ra, xóa tất cả các tập tin được tạo ra (.ncb, vv) là không đủ. Nó cũng không phải là vấn đề của các tập tin trong tương lai. –

+0

Rất cám ơn, tôi đã đấu tranh với cùng một vấn đề. –

4

Tôi vừa "cố định" cùng vấn đề với dự án VS của mình. Visual Studio đã luôn luôn xây dựng lại, ngay cả khi không thay đổi bất cứ điều gì. Giải pháp của tôi: Một tệp cs-File có dấu thời gian trong tương lai (Năm 2015, đây là lỗi của tôi). Tôi mở tập tin, lưu nó và vấn đề của tôi đã được giải quyết !!!

0

Nếu bạn tiếp tục gặp phải sự cố này, có thể do thiếu hoặc không phụ thuộc vào ngày được tính toán (như tiêu đề) được liệt kê trong dự án của bạn, nhưng không tồn tại. Điều này xảy ra với tôi đặc biệt phổ biến sau khi chuyển sang phiên bản mới (ví dụ: từ 2012 đến 2013) vì VS có thể tính toán lại các phụ thuộc trong chuyển đổi hoặc bạn đang di chuyển đến một vị trí mới.

Kiểm tra nhanh là nhấp đúp vào từng tệp trong dự án vi phạm từ trình khám phá giải pháp. Nếu bạn phát hiện ra một tập tin không tồn tại, đó là vấn đề của bạn.

Không có tệp bị thiếu đơn giản: Bạn có thể có mối quan hệ ngày xây dựng phức tạp hơn giữa nguồn và đích. Bạn có thể sử dụng tiện ích để tìm hiểu thử nghiệm front-end nào đang kích hoạt bản dựng. Để có được thông tin đó, bạn có thể bật ghi nhật ký CPS tiết kiệm. Xem: Andrew Arnott - Kích hoạt tính năng theo dõi hệ thống dự án C++ và Javascript (http://blogs.msdn.com/b/vsproject/archive/2009/07/21/enable-c-project-system-logging.aspx). Tôi sử dụng tùy chọn DebugView. Công cụ vô giá khi bạn cần.

(đây là một câu hỏi C# cụ thể, nhưng một bài khác nhau được sáp nhập như giống hệt nhau)

Các vấn đề liên quan