2012-10-18 26 views
10

Tôi hoàn toàn mới đối với các chức năng và điều kiện trong tệp .csproj nên bất kỳ và tất cả trợ giúp đều được đánh giá cao.Làm cách nào để kiểm tra chỉ thị của trình biên dịch với Điều kiện MSBuild trong tệp .csproj?

Điều tôi muốn làm là kiểm tra chỉ thị trình biên dịch cụ thể trong cấu hình hiện tại. Một ví dụ sẽ giống như sau:

<Choose> 
    <When Condition= [current configuration has CONST-1 compiler constant defined] > 
     ... 
    </When> 
    <When Condition= [current configuration has CONST-2 compiler constant defined] > 
     ... 
    </When> 
</Choose> 

Tôi không biết điều này thậm chí có thể xảy ra hay không. Nếu có một cách tốt hơn để làm những gì tôi yêu cầu, hãy cho tôi biết điều đó. Dù bằng cách nào, tôi muốn kiểm tra một điều kiện độc lập của cấu hình.

EDIT

Những gì tôi thực sự muốn là một giá trị mà tôi có thể chỉnh sửa một cách dễ dàng, tốt hơn trong Visual Studio, rằng tôi cũng có thể kiểm tra regargless của configuraiton. Tôi nghĩ về hằng số trình biên dịch vì bạn có thể dễ dàng thay đổi chúng trong Thuộc tính dự án trong VS.

+0

Có lẽ phổ biến hơn là sử dụng phần tử 'Thuộc tính'. Tệp csproj của bạn sẽ có các phần tử 'PropertyGroup' có điều kiện, tùy thuộc vào cấu hình. Bên trong chúng, bạn có thể thêm các phần tử 'Property' tùy chỉnh mới và bạn có thể kiểm tra chúng theo cách thông thường trong thuộc tính' Condition = 'của bạn. Điều đó có hiệu quả với bạn hay bạn thực sự cần chỉ thị của trình biên dịch? Chúng phức tạp hơn, bởi vì có nhiều cách khác nhau mà chúng có thể được định nghĩa. – hvd

+0

Có thể. Có cách nào để chỉnh sửa các yếu tố thuộc tính tùy chỉnh, sau khi tôi đã thêm chúng, trong VS dễ dàng mà không cần phải chỉnh sửa tệp .csproj mỗi khi tôi muốn thay đổi chúng? –

+0

Điều tôi muốn là giá trị được xác định là tôi có thể thay đổi và kiểm tra bất kể cấu hình là gì. –

Trả lời

8

Hằng số trình biên dịch được đặt thành thuộc tính "DefineConstants" nên bạn chỉ có thể đánh giá thuộc tính đó. Câu lệnh Choose của bạn cần phải đi sau Nhóm sản phẩm để xác định các hằng số hoặc bên trong một mục tiêu.

<Choose> 
    <When Condition="$(DefineConstants.Contains(CONST-1))"> 
     ... 
    </When> 
    <When Condition="$(DefineConstants.Contains(CONST-2))"> 
     ... 
    </When> 
</Choose> 
+1

Cảm ơn điều này làm việc hoàn hảo ... Tuy nhiên tôi đã phải loại bỏ các dấu ngoặc kép xung quanh CONST-1 hoặc bất kỳ định nghĩa có điều kiện là – Randeep

5

Trong trường hợp bạn sử dụng MSBuild 4 trở lên, tôi khuyên bạn nên sử dụng Regular Expression thay vì String.Contains(). Lý do cho điều này là mặc dù String.Contains() thường hoạt động tốt, có một số trường hợp bạn có thể gặp vấn đề.

Ví dụ:

Xem xét trường hợp khi bạn sử dụng chỉ thị CONST-1 và CONST-12 trong mã của bạn. Tuy nhiên, bạn quyết định chỉ định chỉ thị CONST-12 cho bản dựng hiện tại.
Bây giờ Condition="$(DefineConstants.Contains('CONST-1'))" đánh giá là True mặc dù CONST-1 không được xác định.

Giải pháp với RegularExpressions.RegEx:

<When Condition="$([System.Text.RegularExpressions.Regex]::IsMatch($(DefineConstants), '^(.*;)*CONST-1(;.*)*$'))"> 
... 
</When> 

Tóm lại, bạn có thể phải cẩn thận để đảm bảo bạn không sử dụng chỉ thị đó là xâu của người khác hoặc bạn có thể sử dụng các biểu thức chính quy và không lo lắng tại tất cả các.

0

Để thêm vào các câu trả lời khác được đăng ở đây, một cách khác mà bạn có thể tiếp cận này là bọc thuộc tính DefineConstants với dấu chấm phẩy, để đảm bảo rằng "; CONST-1;" sẽ được chứa trong DefineConstants nếu và chỉ khi hằng số "CONST-1" được xác định. Không có dấu chấm phẩy, bạn có thể có CONST-100, hoặc UNCONST-1, nhưng không phải CONST-1, là một biến và nó sẽ đánh giá đúng.

<PropertyGroup> 
    <DefineConstants2>;$(DefineConstants);</DefineConstants2> 
    <Foo Condition="'$(DefineConstants2.Contains(`;CONST-1;`))'">It worked</Foo> 
    <Bar>$(Foo)</Bar> <!--It worked--> 
</PropertyGroup> 
Các vấn đề liên quan