2011-05-25 25 views
5

dự án tôi có một tài sản Version gọi là dự án C# định nghĩa làSử dụng một biến môi trường Đội bóng thành phố để ghi đè lên một tài sản

<Version Condition="$(Version)==''">1.2.3.4<Version> 

1.2.3.4 là giá trị mặc định.

Tôi có thuộc tính hệ thống Team City, còn được gọi là Phiên bản, được thiết lập để ghi đè. Vì vậy, trong hộp thoại chạy tùy chỉnh trong Team City, tôi có thể chỉ định giá trị cho Phiên bản và giá trị đó được sử dụng. Điều này hoạt động tốt.

Nếu tôi để trống tham số trong Team City, tuy nhiên, giá trị mặc định vẫn được ghi đè bằng trống (null?). Nếu tôi xóa tham số Team City, giá trị mặc định sẽ được sử dụng.

Điều kiện có chính xác không? Làm cách nào để tôi có thể thiết lập thuộc tính Thành phố nhóm để trống và chỉ ghi đè nếu tôi nhập một số giá trị?

Trả lời

6

câu trả lời Cập nhật sau khi bình luận OP của:

Từ tài liệu:

MSBuild cho phép bạn thiết lập các thuộc từ dòng lệnh bằng cách sử dụng /tài sản hoặc/p chuyển đổi dòng lệnh. Giá trị thuộc tính nhận được từ các giá trị thuộc tính ghi đè dòng lệnh đặt trong tệp dự án và thuộc tính giá trị được kế thừa từ môi trường biến.

Vì vậy, bạn chỉ có thể thiết lập một tài sản $ (VersionTC) trong cấu hình TeamCity và kiểm tra nếu tài sản đó là trống hay không và thiết lập phiên bản

<Version>$(VersionTC)<Version> 
<Version Condition="'$(VersionTC)'==''">1.2.3.4<Version> 

(do đó bạn thiết lập Version-VersionTC đầu tiên. Sau đó thấy nếu nó trống và đặt mặc định)

Hãy xem điều này blog post giải thích tất cả điều này.


Hãy thử một cái gì đó như dưới đây:

<Version Condition=" '$(Version)'=='' ">1.2.3.4<Version> 

Lưu ý ' ' (dấu nháy đơn) xung quanh $(Version)

+0

cảm ơn, điều đó dường như không giúp được – jbemt48

+0

@Spider M9 - điều đó chỉ dành cho sự rõ ràng. Bạn không nhận thấy thêm '''' xung quanh $ (Phiên bản)? – manojlds

+0

@ jbemt48 - Tôi đã cập nhật câu trả lời của mình – manojlds

4

Đội bóng thành phố có lẽ vẫn đi qua các tham số trên dòng lệnh, chỉ với một giá trị trống , như trong,

/p:Version="" 

hoặc thứ gì đó si milar. Triệu chứng bạn đang thấy là do cách MSBuild xử lý các thuộc tính bị ghi đè. Khi được chỉ định trên một dòng lệnh, một thuộc tính sẽ lấy giá trị đó hay không nó cũng được khai báo trong một khai báo thuộc tính tĩnh (toàn cục trong tệp, không phải bên trong một thuộc tính). Vì vậy, tuyên bố của bạn Phiên bản, với điều kiện được kiểm tra cho chuỗi rỗng, đang được bỏ qua hoàn toàn.

Một cách xung quanh việc này là di chuyển Nhóm thuộc tính của bạn chứa khai báo $ (Phiên bản), với Điều kiện của nó, bên trong mục tiêu nơi nó được sử dụng lần đầu tiên. MSBuild sẽ cho phép ghi đè lên giá trị của một thuộc tính dòng lệnh từ một thuộc tính "động" được tạo tại thời gian chạy từ bên trong một đích.

Nếu bạn chạy dòng lệnh này ...

> msbuild My.proj /t:Ver /p:Version="" 

... và có mục tiêu này ...

<Target Name="Ver"> 
    <PropertyGroup> 
    <Version Condition="'$(Version)' == ''">1.2.3.4<Version> 
    </PropertyGroup> 
    <Message Text="Version: '$(Version)'" /> 
</Target> 

... bạn sẽ nhận được bản thể hiện 1.2.3.4, trong khi với PropertyGroup bên ngoài đích, nó sẽ giữ lại giá trị rỗng.

+0

và nó sẽ không hoạt động ngay cả khi bạn di chuyển đến bên trong Target trừ khi bạn sử dụng . Xem câu trả lời cập nhật của tôi – manojlds

+0

Di chuyển một Nhóm thuộc tính bên trong một mục tiêu là cú pháp tương đương 4,0 cho tác vụ CreateProperty cũ (gần) đã lỗi thời. Và nó sẽ hoạt động, hãy thử nó! –

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