2011-05-27 22 views
5

Dự án C++ tôi đang làm việc (mà tôi đã chuyển đổi từ VS2008 sang VS2010) được sử dụng để sử dụng một số tệp .cules vcbuild để chỉ định các quy tắc xây dựng tùy chỉnh. Các tệp .rules này có một thuộc tính "AdditionalDependencies" cụ thể cho nút CustomBuildRule, chỉ định một danh sách các tệp cần được tính đến khi làm việc nếu mục tiêu cần xây dựng lại hay không. Các "AdditionalDependencies" này được chuyển thành trung thành tệp .props tương ứng trong quá trình chuyển đổi VS2010.Làm cách nào để thực hiện tùy chỉnh MSBuild Target tùy thuộc vào dấu thời gian của tệp?

Tệp .targets được liên kết với quy tắc xây dựng tùy chỉnh sẽ thêm các thuộc tính AdditionalDependencies này vào thuộc tính Inputs của nút Target. Điều này đảm bảo rằng mục tiêu được thực hiện trong trường hợp bất kỳ tệp nào được liệt kê trong các phụ thuộc không tồn tại, nhưng nó không thực thi đích nếu một trong các phụ thuộc là mới hơn đầu ra của đích. Nó cũng không hoàn toàn chính xác vì không phải tất cả các tệp đều là đầu vào, một vài trong số chúng tham chiếu đến các tệp thực thi có thể được sử dụng trong quá trình xây dựng của mục tiêu. Như vậy, chúng có thể được kiểm tra vào kiểm soát phiên bản và sẽ có mặt, nhưng phiên bản mới hơn của tệp cần kích hoạt việc xây dựng lại mục tiêu bị ảnh hưởng.

Nút MSDN documentation for the Target hiển thị thuộc tính Condition sẽ hoạt động tốt cho các yêu cầu của tôi, nhưng các điều kiện được tài sản này hỗ trợ không xuất hiện qua quá trình kiểm tra 'Hiện có' đã được thực hiện. Có một điều kiện mà tôi có thể sử dụng sẽ so sánh tem thời gian của hai tập tin (hoặc lý tưởng là dấu thời gian của các tệp hiện được liệt kê trong AdditionalDependencies đối với tệp đầu ra của Target) và do đó cho phép tôi kích hoạt "xây dựng lại mục tiêu này nếu nó đã lỗi thời những phụ thuộc này"?

Trả lời

2

hãy xem xét kỹ hơn đến mục tiêu Output tài sản:

"MSBuild có thể so sánh các timestamps của các tập tin đầu vào với timestamps của các tập tin đầu ra và xác định xem có nên bỏ qua, xây dựng, hoặc một phần xây dựng lại một mục tiêu . trong ví dụ sau, nếu bất kỳ tập tin trong @ (CSFile) mục danh sách mới hơn file hello.exe, MSBuild sẽ chạy mục tiêu, nếu không nó sẽ bị bỏ qua:"

<Target Name="Build" 
    Inputs="@(CSFile)" 
    Outputs="hello.exe"> 

    <Csc 
     Sources="@(CSFile)" 
     OutputAssembly="hello.exe"/> 
</Target> 

các bài viết gốc và biết thêm thông tin về các bản dựng tăng dần với MSBuild có thể được tìm thấy here.

+0

Có, tôi biết các thuộc tính Đầu vào và Đầu ra cho mục tiêu. Vấn đề là ngay cả khi các đầu vào bất động sản có chứa tên của 'máy phát điện' thực thi và các dấu thời gian thay đổi, các đầu ra không nhất thiết phải tái sinh. –

+1

Có lẽ "tên của máy phát thực thi" trong thuộc tính đầu vào không đại diện cho một đường dẫn đến tệp, và kết quả là MSBuild không thể phát hiện dấu thời gian đã thay đổi. – KimCM

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