2009-03-10 36 views
10

Tôi có một tệp SLN bình thường, và tôi đang biên soạn nó tốt với msbuild từ dòng lệnh. Tôi làm điều này:msbuild SLN và vẫn nhận được kết quả đầu ra dự án riêng biệt?

C: \ slndir> msbuild/p: OutDir = C: \ slnbin \

Và nó bãi tất cả mọi thứ vào C: \ slnbin, ngoại trừ cho các trang web, mà được triển khai để C: \ slnbin_PublishedWebsites \.

Điều tôi muốn là không chỉ có tất cả các tệp nhị phân bị bỏ trong thư mục bin, mà còn có mỗi chương trình thực thi có thư mục "triển khai" của riêng nó, tương tự như những gì mỗi trang web nhận được.

Vì vậy, ví dụ, Nếu tôi có các dự án sau: - Common - Lib1 - Service1 - Lib2 - Service2

Tôi wan để nhận được:

C:\slnbin\ // Everything 
    C:\slbin\Deploy\Service1 // Common, Lib1, Service1 
    C:\slbin\Deploy\Service2 // Common, Lib2, Service2 

Tôi đã cố gắng làm các công cụ như "msbuild/p: OutDir = C: \ slnbin \ $ (ProjectName)", nhưng nó chỉ xử lý nó như là một chữ và tạo ra một "$ (ProjectName)" subdir thực tế.

Ưu tiên, tôi sẽ không phải sửa đổi từng dự án riêng lẻ, v.v.

Điều này có khả thi không? Dễ dàng?

Trả lời

13

Giống như John Saunders cho biết, bạn cần phải có tệp MSBuild chính xử lý quy trình.

Dưới đây là một mẫu sử dụng MSBuild Community Tasks: GetSolutionProjects mà được các dự án cho một giải pháp cho

<?xml version="1.0" encoding="utf-8"?> 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Package"> 

    <Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/> 

    <!-- Specify here, the solution you want to compile--> 
    <ItemGroup> 
    <Solution Include="C:\slndir\solution.sln"/> 
    </ItemGroup> 

    <PropertyGroup> 
    <Platform>AnyCPU</Platform> 
    <Configuration>Debug</Configuration> 

    <!-- Your deployment directory --> 
    <DeployDir>C:\slbin\Deploy</DeployDir> 
    </PropertyGroup> 

    <!-- Gets the projects composing the specified solution --> 
    <Target Name="GetProjectsFromSolution"> 
    <GetSolutionProjects Solution="%(Solution.Fullpath)"> 
     <Output ItemName="ProjectFiles" TaskParameter="Output"/> 
    </GetSolutionProjects> 
    </Target> 

    <Target Name="CompileProject" DependsOnTargets="GetProjectsFromSolution"> 
    <!-- 
     Foreach project files 
     Call MSBuild Build Target specifying the outputDir with the project filename. 
    --> 
    <MSBuild Projects="%(ProjectFiles.Fullpath)" 
      Properties="Platform=$(Platform); 
      Configuration=$(Configuration); 
      OutDir=$(DeployDir)\%(ProjectFiles.Filename)\" 
      Targets="Build"> 
    </MSBuild> 
    </Target> 
</Project> 
+1

Điều này rất hữu ích đối với chúng tôi. Một câu hỏi - khi bạn gọi MSBuild passing Projects = "% (ProjectFiles.Fullpath)", MSBuild có đủ thông minh để chỉ xây dựng từng dự án một lần không? Ví dụ, nếu bạn có foo.dll trong Solution, và được tham chiếu bởi 4 dự án khác, nó sẽ xây dựng foo.dll một lần, hay 4 lần, hay 5 lần? –

+2

"Không giống như sử dụng Exec Task để khởi động MSBuild.exe, nhiệm vụ này sử dụng cùng một quá trình MSBuild để xây dựng các dự án con. Danh sách các mục tiêu đã được xây dựng có thể bỏ qua được chia sẻ giữa cha và con. nhanh hơn vì không có quá trình tạo MSBuild mới nào được tạo. " Vì vậy, tôi đoán foo.dll sẽ được xây dựng một thời gian nhưng tôi không chắc chắn. –

+2

Whats dòng lệnh cần thiết để xây dựng này? –

1

Bạn sẽ phải thực hiện việc này "bằng tay". Tạo một tệp dự án MSBUILD chính để xây dựng giải pháp, sau đó sao chép tất cả các kết quả đầu ra của giải pháp mà nó muốn chúng. Đây là (khoảng) cách Visual Studio Team Build thực hiện điều đó.

+1

Vì vậy, tôi không thể tận dụng thực tế là các tập tin csproj biết tất cả phụ thuộc của họ? Điều này có nghĩa là tôi phải duy trì sự phụ thuộc ở hai vị trí (csprojs và msbuild)? – MichaelGG

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