2009-09-02 37 views
14

Tôi muốn khai báo ba thuộc tính trong tệp MSBuild của tôi và ghi đè lên một thuộc tính với giá trị khác (tùy thuộc vào đích được gọi), nhưng không thể tìm ra cách thực hiện. Tệp xây dựng của tôi trông giống như sau:Ghi đè các thuộc tính với MSBuild

<PropertyGroup> 
    <DeployPath_TEST>\\test-server-path\websites\mysite</DeployPath_TEST> 
    <DeployPath_LIVE>\\live-server-path\websites\mysite</DeployPath_LIVE> 
    <DeployPath></DeployPath> 
</PropertyGroup> 

<Target Name="Deploy-TEST"> 
    <PropertyGroup> 
     <DeployPath>$(DeployPath_TEST)</DeployPath> 
    </PropertyGroup> 
    <CallTarget Targets="Deploy-Sub"/> 
</Target> 

<Target Name="Deploy-LIVE"> 
    <PropertyGroup> 
     <DeployPath>$(DeployPath_TEST)</DeployPath> 
    </PropertyGroup> 
    <CallTarget Targets="Deploy-Sub"/> 
</Target> 

<Target Name="Deploy-Sub"> 
    <Message Text="Deploying to $(DeployPath)"/> 
    <MSBuild Projects="MySolution.csproj" Targets="Rebuild" /> 

    <ItemGroup> 
    <MyFiles Include="**\*"/> 
    </ItemGroup> 

    <Copy SourceFiles="@(MyFiles)" 
     DestinationFiles="@(MyFiles->'$(DeploymentPath)\%(RecursiveDir)%(FileName)%(Extension)')"/> 

</Target> 

Hiện tại tôi đang cố gắng khai báo lại thuộc tính về giá trị của nó, nhưng điều này không có tác dụng.

Trả lời

13

Mehmet là đúng về làm thế nào để thiết lập một giá trị tài sản từ tài sản khác, nhưng có một lỗi/tính năng trong MSBuild có nghĩa là nếu bạn gọi CreateProperty và CallTarget trong mục tiêu đó, sở hữu mới của bạn sẽ không có sẵn trên toàn cầu cho các mục tiêu khác (described here).

Vì vậy, đây là giải pháp cuối cùng cho vấn đề:

<PropertyGroup> 
    <DeployPath_TEST>\\test-server-path\websites\mysite</DeployPath_TEST> 
    <DeployPath_LIVE>\\live-server-path\websites\mysite</DeployPath_LIVE> 
    <DeployPath></DeployPath> 
</PropertyGroup> 

<Target Name="SetDeployPath-TEST"> 
    <CreateProperty Value="$(DeployPath_TEST)"> 
    <Output TaskParameter="Value" PropertyName="DeployPath"/> 
    </CreateProperty> 
</Target> 

<Target Name="Deploy-TEST"> 
    <CallTarget Targets="SetDeployPath-TEST"/> 
    <CallTarget Targets="Deploy-Sub"/> 
</Target> 

<Target Name="Deploy-Sub"> 
    <Message Text="Deploying to $(DeployPath)"/> 
    <MSBuild Projects="MySolution.csproj" Targets="Rebuild" /> 

    <ItemGroup> 
    <MyFiles Include="**\*"/> 
    </ItemGroup> 

    <Copy SourceFiles="@(MyFiles)" 
    DestinationFiles="@(MyFiles->'$(DeploymentPath)\%(RecursiveDir)%(FileName)%(Extension)')"/> 

</Target> 
+0

Cảm ơn bạn, đó là hữu ích. Tôi vẫn còn hơi mới mẻ đối với việc tạo nhóm và MS không thực hiện tốt công việc giải thích các khái niệm liên quan theo ý kiến ​​của tôi. Một lưu ý nữa. Tôi thực sự đã đi mà không tạo ra một tài sản toàn cầu; để thu hẹp ngữ cảnh một chút để đọc mã dễ dàng hơn: Mục tiêu A gọi các mục tiêu B và C. B đặt một thuộc tính danh sách và C thực hiện phân lô theo giá trị của thuộc tính đó. như mdresser lưu ý thiết lập các tài sản trong cùng một mục tiêu đã không làm việc. Hy vọng nó sẽ giúp một ai đó; Tôi đã dành 3-4 giờ cố gắng để hiểu điều này trước khi tôi tìm thấy bài đăng này. – AlexeiOst

+0

Một điểm nữa, bạn nói bạn nhận được thông báo rằng chỉ có Mèo đã thay đổi, bạn đã thử lưu các thay đổi chưa? Nó có hoạt động không? (Tôi nghi ngờ nó) –

8

Bạn có thể sử dụng tác vụ CreateProperty để ghi đè giá trị của thuộc tính hiện tại.

<Target Name="Deploy-LIVE"> 
    <CreateProperty Value="$(DeployPath_LIVE)"> 
    <Output PropertyName="DeployPath" TaskParameter="Value"/> 
    </CreateProperty> 
    <CallTarget Targets="Deploy-Sub"/> 
</Target> 
+0

này dường như không làm việc cho tôi. Tôi có thể sử dụng giá trị của thuộc tính DeployPath ngay sau khối CreateProperty, nhưng nó mất giá trị của nó trong mục tiêu Deploy-Sub. –

+2

Haa, chỉ tìm thấy bài viết này http://weblogs.asp.net/bhouse/archive/2006/03/20/440648.aspx mô tả một lỗi/tính năng với tác vụ CreateProperty. –

+0

Thú vị tôi không biết về lỗi này. Tôi đã sử dụng CreateProperty trước nhưng dường như không có gì cần thiết để truy cập thuộc tính ghi đè bên ngoài mục tiêu ghi đè nó. Cảm ơn. –

4

tôi thường tránh nhiệm vụ CallTarget. Tốt hơn nhiều là sử dụng phụ thuộc mục tiêu.

+0

Bạn có thể xây dựng một chút không? Tại sao nó tốt hơn cho bạn? –

+2

@HaymoKutschbach vì lỗi này http://sedodream.com/PermaLink,guid,dd6cb1db-c0e4-47f7-ad84-6e59ff6b03d0.aspx và tôi nghĩ CallTarget đi ngược lại mô hình tinh thần về cách sử dụng msbuild. MSBuild là khai báo, CallTarget là rất cấp bách. Với điều đó nói rằng có một số trường hợp khi cần thiết, nhưng u nên thích DependsOn trước CallTarget. –

+0

Cảm ơn! Tôi đồng ý và có vẻ như nhóm msbuild khuyến khích DependsOn cũng như cho phép các thuộc tính được thiết lập toàn cầu trong các dự án được nhập khẩu. –

0

Bên cạnh đó, bạn có thể dùng cách sau:

<PropertyGroup> 
    <DeployPath_TEST>\\test-server-path\websites\mysite</DeployPath_TEST> 
    <DeployPath_LIVE>\\live-server-path\websites\mysite</DeployPath_LIVE> 
    <DeployPath></DeployPath> 
</PropertyGroup> 

<Target Name="SetDeployPath-TEST"> 
    <CreateProperty Value="$(DeployPath_TEST)"> 
    <Output TaskParameter="Value" PropertyName="DeployPath"/> 
    </CreateProperty> 
</Target> 

<Target Name="Deploy-Sub" DependsOnTargets="SetDeployPath-TEST"> 
    <Message Text="Deploying to $(DeployPath)"/> 
    <MSBuild Projects="MySolution.csproj" Targets="Rebuild" /> 

    <ItemGroup> 
    <MyFiles Include="**\*"/> 
    </ItemGroup> 

    <Copy SourceFiles="@(MyFiles)" 
    DestinationFiles="@(MyFiles->'$(DeploymentPath)\%(RecursiveDir)%(FileName)%(Extension)')"/> 

</Target> 
Các vấn đề liên quan