2013-06-03 26 views
25

Tôi đang cố gắng triển khai một trong các dự án web trong giải pháp của tôi tới máy chủ. Tôi đang sử dụng msbuild trên TeamCity như vậy:Xuất bản một dự án web từ giải pháp với msbuild

msbuild MySolution.sln /t:WebSite:Rebuild /p:DeployOnBuild=True /p:PublishProfile=Prod ... 

Tuy nhiên, khi tôi chạy nó, msbuild vẫn cố gắng để xây dựng dự án WebService tôi, mặc dù dự án WebSite của tôi không phụ thuộc vào nó (nhưng nó không phụ thuộc vào một Services dự án cũng trong giải pháp). Làm thế nào để chỉ xuất bản một dự án, hay còn gọi là WebSite?

Tôi cũng đã cố gắng xây dựng hồ sơ dự án sử dụng

msbuild WebSite/WebSite.csproj /p:DeployOnBuild=True ... 

nhưng sau đó nó phàn nàn rằng nó không thể khôi phục gói:

[07:47:17]WebSite\WebSite.csproj.teamcity: Build target: Build 
[07:47:17][WebSite\WebSite.csproj.teamcity] RestorePackages 
[07:47:17][RestorePackages] Exec 
[07:47:17][Exec] C:\TeamCity\buildAgent\work\cab8a3d752df3a51\.nuget\NuGet.targets(90, 15): error MSB4064: The "LogStandardErrorAsError" parameter is not supported by the "Exec" task. Verify the parameter exists on the task, and it is a settable public instance property. 
[07:47:17][Exec] C:\TeamCity\buildAgent\work\cab8a3d752df3a51\.nuget\NuGet.targets(89, 9): error MSB4063: The "Exec" task could not be initialized with its input parameters. 
[07:47:17][WebSite\WebSite.csproj.teamcity] Project WebSite\WebSite.csproj.teamcity failed. 

Khi tôi vô hiệu hóa NuGet Package Restore, CoreCompile (CSC) không có lỗi mà tôi chưa từng nghe và không nên xảy ra:

[07:54:43]WebSite\WebSite.csproj.teamcity: Build target: Build (13s) 
[07:54:55][WebSite\WebSite.csproj.teamcity] CoreCompile 
[07:54:55][CoreCompile] Csc 
[07:54:56][Csc] Areas\Api\Services\TripService.cs(19, 104): error CS0241: Default parameter specifiers are not permitted 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(11, 35): error CS1031: Type expected 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(11, 53): error CS1002: ; expected 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(16, 28): error CS1519: Invalid token '(' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(16, 37): error CS1519: Invalid token ',' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(17, 27): error CS1519: Invalid token '(' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(17, 32): error CS1519: Invalid token ')' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(23, 17): error CS1519: Invalid token 'for' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(23, 26): error CS1519: Invalid token '<=' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(23, 45): error CS1519: Invalid token '-' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(23, 51): error CS1519: Invalid token '++' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(24, 34): error CS0270: Array size cannot be specified in a variable declaration (try initializing with a 'new' expression) 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(24, 37): error CS1519: Invalid token '==' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(24, 51): error CS1519: Invalid token ')' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(24, 63): error CS1519: Invalid token '++' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(25, 41): error CS1519: Invalid token '>' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(25, 53): error CS1519: Invalid token ')' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(27, 36): error CS1519: Invalid token '=' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(27, 48): error CS1519: Invalid token ';' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(28, 36): error CS1519: Invalid token '=' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(29, 37): error CS1519: Invalid token '=' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(29, 48): error CS0270: Array size cannot be specified in a variable declaration (try initializing with a 'new' expression) 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(29, 50): error CS1519: Invalid token ';' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(30, 33): error CS1519: Invalid token '=' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(30, 44): error CS0270: Array size cannot be specified in a variable declaration (try initializing with a 'new' expression) 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(30, 50): error CS1519: Invalid token ';' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(32, 21): error CS0116: A namespace does not directly contain members such as fields or methods 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(35, 50): error CS1518: Expected class, delegate, enum, interface, or struct 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(38, 21): error CS0116: A namespace does not directly contain members such as fields or methods 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(40, 50): error CS1518: Expected class, delegate, enum, interface, or struct 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(42, 21): error CS1022: Type or namespace definition, or end-of-file expected 
[07:54:56][Csc] Helpers\UrlHelperExtensions.cs(8, 59): error CS1031: Type expected 
[07:54:56][Csc] Helpers\UrlHelperExtensions.cs(8, 80): error CS1002: ; expected 
[07:54:56][Csc] Helpers\UrlHelperExtensions.cs(10, 55): error CS1519: Invalid token '(' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\UrlHelperExtensions.cs(10, 60): error CS1520: Class, struct, or interface method must have a return type 
[07:54:56][Csc] Helpers\UrlHelperExtensions.cs(10, 82): error CS1002: ; expected 
[07:54:56][Csc] Helpers\UrlHelperExtensions.cs(13, 23): error CS1518: Expected class, delegate, enum, interface, or struct 
[07:54:56][Csc] Helpers\UrlHelperExtensions.cs(15, 60): error CS1518: Expected class, delegate, enum, interface, or struct 
[07:54:56][Csc] Helpers\UrlHelperExtensions.cs(18, 23): error CS1518: Expected class, delegate, enum, interface, or struct 
[07:54:56][Csc] Helpers\UrlHelperExtensions.cs(20, 25): error CS1518: Expected class, delegate, enum, interface, or struct 
[07:54:56][Csc] Helpers\UrlHelperExtensions.cs(23, 28): error CS1518: Expected class, delegate, enum, interface, or struct 
[07:54:56][Csc] Helpers\UrlHelperExtensions.cs(26, 28): error CS1518: Expected class, delegate, enum, interface, or struct 
[07:54:56][Csc] Helpers\UrlHelperExtensions.cs(29, 24): error CS1518: Expected class, delegate, enum, interface, or struct 
[07:54:56][Csc] Helpers\UrlHelperExtensions.cs(29, 84): error CS1518: Expected class, delegate, enum, interface, or struct 
[07:54:56][Csc] Helpers\UrlHelperExtensions.cs(32, 28): error CS1518: Expected class, delegate, enum, interface, or struct 
[07:54:56][Csc] Helpers\UrlHelperExtensions.cs(35, 9): error CS1022: Type or namespace definition, or end-of-file expected 
[07:54:56][Csc] Helpers\UrlHelperExtensions.cs(23, 26): error CS0101: The namespace '<global namespace>' already contains a definition for '?' 
[07:54:56][Csc] Helpers\UrlHelperExtensions.cs(26, 26): error CS0101: The namespace '<global namespace>' already contains a definition for '?' 
[07:54:56][Csc] Helpers\UrlHelperExtensions.cs(29, 22): error CS0101: The namespace '<global namespace>' already contains a definition for '?' 
[07:54:56][Csc] Helpers\UrlHelperExtensions.cs(29, 83): error CS0101: The namespace '<global namespace>' already contains a definition for '?' 
[07:54:56][Csc] Helpers\UrlHelperExtensions.cs(32, 26): error CS0101: The namespace '<global namespace>' already contains a definition for '?' 
[07:54:56][Csc] Controllers\SessionController.cs(13, 51): error CS0241: Default parameter specifiers are not permitted 
[07:54:56][Csc] Helpers\JsonNetResult.cs(13, 44): error CS1031: Type expected 
[07:54:56][Csc] Helpers\JsonNetResult.cs(13, 72): error CS1041: Identifier expected, 'object' is a keyword 
[07:54:56][Csc] Helpers\JsonNetResult.cs(13, 91): error CS1002: ; expected 
[07:54:56][Csc] Helpers\JsonNetResult.cs(16, 38): error CS1519: Invalid token '=' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\JsonNetResult.cs(16, 59): error CS1519: Invalid token ';' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\JsonNetResult.cs(17, 64): error CS1519: Invalid token '=' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\JsonNetResult.cs(17, 90): error CS1519: Invalid token ';' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\JsonNetResult.cs(18, 32): error CS1519: Invalid token '=' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\JsonNetResult.cs(18, 46): error CS1519: Invalid token ';' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\JsonNetResult.cs(19, 33): error CS1519: Invalid token ';' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\JsonNetResult.cs(22, 23): error CS1518: Expected class, delegate, enum, interface, or struct 
[07:54:56][Csc] Helpers\JsonNetResult.cs(25, 37): error CS1518: Expected class, delegate, enum, interface, or struct 
[07:54:56][Csc] Helpers\JsonNetResult.cs(32, 23): error CS1518: Expected class, delegate, enum, interface, or struct 
[07:54:56][Csc] Helpers\JsonNetResult.cs(35, 37): error CS1518: Expected class, delegate, enum, interface, or struct 
[07:54:56][Csc] Helpers\JsonNetResult.cs(40, 9): error CS1022: Type or namespace definition, or end-of-file expected 
[07:54:56][Csc] Mailers\ITripMailer.cs(13, 132): error CS0241: Default parameter specifiers are not permitted 
[07:54:56][Csc] Mailers\TripMailer.cs(54, 85): error CS0241: Default parameter specifiers are not permitted 
[07:54:56][Csc] Services\Impl\AuthorizationService.cs(12, 70): error CS0241: Default parameter specifiers are not permitted 
[07:54:56][Csc] Services\Impl\AuthorizationService.cs(43, 77): error CS0241: Default parameter specifiers are not permitted 
[07:54:56][WebSite\WebSite.csproj.teamcity] Project WebSite\WebSite.csproj.teamcity failed. 

Trả lời

48

Tôi blog ged về điều này tại http://sedodream.com/2013/03/06/HowToPublishOneWebProjectFromASolution.aspx một vài tháng trở lại. Tôi cũng đã sao chép chi tiết ở đây, xem bên dưới.


Hôm nay trên twitter @nunofcosta hỏi tôi khoảng câu hỏi “Làm thế nào để công bố một dự án web từ một giải pháp có chứa nhiều?”

Vấn đề mà ông đang chạy vào được rằng ông đang xây dựng từ dòng lệnh và chuyển các thuộc tính sau vào msbuild.exe.

/p:DeployOnBuild=true 
/p:PublishProfile='siteone - Web Deploy' 
/p:Password=%password% 

Bạn có thể đọc thêm về cách tự động xuất bản tại http://sedodream.com/2013/01/06/CommandLineWebProjectPublishing.aspx.

Khi bạn chuyển các thuộc tính này vào msbuild.exe, chúng được gọi là thuộc tính tổng thể. Các thuộc tính này rất khó ghi đè và được truyền cho mọi dự án được xây dựng. Bởi vì điều này nếu bạn có một giải pháp với nhiều dự án web, khi mỗi dự án web được xây dựng nó được truyền trong cùng một tập hợp các thuộc tính. Bởi vì điều này khi mỗi dự án được xây dựng quá trình xuất bản cho dự án đó sẽ bắt đầu và nó sẽ mong đợi để tìm một tập tin có tên siteone - Web Deploy.pubxml trong thư mục * Properties \ PublishProfiles *. Nếu tệp không tồn tại, thao tác có thể không thành công.

Lưu ý: Nếu bạn quan tâm đến việc sử dụng kỹ thuật này cho một xuất bản phối hợp, hãy xem nhận xét của tôi tại https://stackoverflow.com/a/14231729/105999 trước khi làm như vậy.

Vậy làm cách nào để chúng tôi có thể giải quyết vấn đề này?

Hãy xem mẫu (xem các liên kết bên dưới). Tôi có giải pháp, PublishOnlyOne, với các dự án sau.

  1. ProjA
  2. ProjB

ProjA có một hồ sơ công bố có tên là ‘siteone - Web Triển khai’, ProjB không.Khi cố gắng xuất bản, bạn có thể thử dòng lệnh sau.

msbuild.exe PublishOnlyOne.sln /p:DeployOnBuild=true /p:PublishProfile=’siteone – Web Deploy’ /p:Password=%password% 

Xem xuất bản-sln.cmd trong các mẫu.

Nếu bạn làm điều này, khi thời gian ProjB xây dựng nó sẽ thất bại vì không có siteone - Triển khai Web tiểu sử cho dự án đó. Bởi vì điều này, chúng tôi không thể vượt qua DeployOnBuild. Thay vào đó, đây là những gì chúng ta cần làm.

  1. Sửa ProjA.csproj để xác định một tài sản mà có điều kiện sẽ thiết lập DeployOnBuild
  2. Từ dòng lệnh vượt qua trong bất động sản

tôi sửa ProjA và bổ sung các nhóm tài sản sau đây trước khi báo cáo hàng hóa nhập khẩu mà tệp .csproj.

<PropertyGroup> 
<DeployOnBuild Condition=" '$(DeployProjA)'!='' ">$(DeployProjA)</DeployOnBuild> 
</PropertyGroup> 

Tại đây bạn có thể thấy rằng DeployOnBuild được đặt thành bất kỳ giá trị nào DeployProjA miễn là nó không trống. Bây giờ, lệnh được sửa đổi là:

msbuild.exe PublishOnlyOne.sln /p:DeployProjA=true /p:PublishProfile=’siteone – Web Deploy’ /p:Password=%password% 

Ở đây thay vì đi qua DeployOnBuild, tôi chuyển qua DeployProjA sau đó sẽ đặt DeployOnBuild. Vì DeployOnBuild không được chuyển cho ProjB nên nó sẽ không cố gắng xuất bản.

Bạn có thể tìm mẫu hoàn chỉnh tại https://github.com/sayedihashimi/sayed-samples/tree/master/PublishOnlyOne.

+0

đẹp writeup! Điều này chắc chắn có ý nghĩa. Tuy nhiên, tôi đã giải quyết xong vấn đề của mình bằng cách tạo một tệp msbuild dựa trên một câu hỏi khác trên SO: http://stackoverflow.com/questions/3097489/how-to-publish-web-with-msbuild –

+1

Đây là một câu trả lời rất thông minh và tôi muốn cảm ơn bạn rất nhiều vì điều đó.Nó giải quyết một vấn đề nghiêm trọng đối với tôi! –

+0

Tuyệt vời! Đây chính xác là những gì tôi cần và làm việc một cách hoàn hảo, cảm ơn câu trả lời và bài đăng blog tuyệt vời –

12

Có một giải pháp đơn giản hơn đơn giản hơn cho việc này. MSBuild hỗ trợ nhắm mục tiêu một dự án duy nhất trong khi xây dựng giải pháp. Bạn làm điều này bằng cách đặt tên dự án trong tham số Target. Lưu ý rằng đây là tên trực quan của dự án bạn chỉ định trong giải pháp (không nhất thiết phải giống như tên của tệp .csproj).

Lưu ý: Chỉ cần "lừa" ở đây là thay thế dấu chấm (.) Trong tên dự án bằng dấu gạch dưới (_).

Ví dụ MSBuild dòng lệnh, nếu tên dự án của bạn là "Your.Project.Name":

msbuild.exe YourSolutionName.sln /T:"Your_Poject_Name" /P:DeployOnBuild=true /P:PublishProfile=YourPublishProfile.pubxml 

Bạn cũng có thể chỉ định một mục tiêu xây dựng cho dự án đó, nhưng mục tiêu này nên tồn tại cho tất cả các dự án trong giải pháp:

msbuild.exe YourSolutionName.sln /T:"Your_Poject_Name:Rebuild" /P:DeployOnBuild=true /P:PublishProfile=YourPublishProfile.pubxml 

Nguồn

  1. Th được là một phần tài liệu trong MSDN từ Visual Studio 2008: nhờ https://msdn.microsoft.com/en-us/library/ms164311(v=vs.140).aspx
  2. đặc biệt để Vasil Trifonov để chỉ ra sự thay thế lừa: http://www.codeproject.com/Articles/654910/How-to-build-a-specific-project-from-a-solution-wi
+0

Công trình này, nhưng dường như không xây dựng tất cả các phụ thuộc của dự án web. Tôi đã thử nghiệm điều này bằng cách tham khảo một thư viện lớp và sau đó chạy lệnh msbuild. Nó sai lầm nói rằng nó không thể tìm thấy thư viện. – Remotec

+0

Điều này sẽ hoạt động khi chúng tôi đang sử dụng kỹ thuật này trong cấu hình CI máy chủ (VS2015). Đảm bảo thư viện lớp của bạn được đặt thành "Xây dựng" theo cấu hình giải pháp tương ứng (được chọn trong hồ sơ xuất bản). – arni

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