2011-09-15 25 views
18

Tôi đang sử dụng Triển khai Web để đóng gói và triển khai các trang web cho sản phẩm của mình. Đặc biệt, tôi có hai dự án khác nhau trong giải pháp của mình, tôi sử dụng phương pháp này để triển khai.Sử dụng MsBuild để tạo tệp kê khai MsDeploy tùy chỉnh (Mục tiêu gói)

Tôi có một dự án thứ ba trong giải pháp (dịch vụ cửa sổ) cũng cần được cài đặt trên máy chủ web.

Tôi biết tôi có thể viết tệp kê khai tùy chỉnh (cho các nhà cung cấp dirPath, filePathrunCommand) và gọi trực tiếp MsDeploy để triển khai. Nhưng tôi muốn tận dụng các nhiệm vụ MsBuild hiện có để đóng gói dịch vụ của tôi nếu có thể.

tôi thấy nó có thể làm một số tuỳ biến của file manifest qua mục tiêu msbuild:

http://social.msdn.microsoft.com/Forums/en/msbuild/thread/1044058c-f762-456b-8a68-b0863027ce47

Riêng bằng MsDeploySourceManifest mục.

Sau khi duyệt qua các tệp mục tiêu thích hợp, có vẻ như contentPath hoặc iisApp sẽ được thêm vào tệp kê khai của tôi nếu tôi sử dụng mục tiêu Package. Lý tưởng nhất là tôi muốn sao chép một assembly (hoặc thư mục), có thể thiết lập ACL và thực thi installutil.exe trên dịch vụ.

Có thể tùy chỉnh hoàn toàn tệp kê khai được tạo bởi mục tiêu Package, bằng cách chỉnh sửa tệp csproj của tôi không?

Nếu không, có cách đơn giản để xây dựng mục tiêu mới sẽ thực hiện tương đương với Package, nhưng cho phép tôi trích xuất tệp kê khai hoàn toàn tùy chỉnh không?

+0

Bạn có nhận được câu trả lời cho điều này không? – musica

+0

@Graci: Tôi đã làm. Tôi đang hoàn thành mục công việc cho điều này trong tuần này, và tôi sẽ đăng một câu trả lời sau khi tôi làm tất cả. Các khái niệm chính là tạo một tệp '.targets' tùy chỉnh, sử dụng các mục tiêu tùy chỉnh của bạn để thêm các mục' runCommand' của nhà cung cấp để thực thi các tệp batch tùy chỉnh (để dừng/gỡ cài đặt dịch vụ và cài đặt/khởi động dịch vụ), thêm một tham số tùy chỉnh. xml tệp cho dự án và đặt một số cờ nhất định, chẳng hạn như 'IncludeIisSettingsOnPublish = False' và' IncludeIisSettingsOnPublish = False'. Oh, và phần mở rộng chuyển đổi miễn phí không biến đổi web chậm cũng giúp ích. –

+0

@Merlyn: Thật tuyệt vời nếu bạn tìm thấy thời gian để chia sẻ giải pháp của mình, từ nhận xét cuối cùng của bạn rằng âm thanh của bạn giống như bạn đã có được nó. –

Trả lời

16

Tôi chưa đăng ký đầy đủ cho những người đang cố gắng tìm hiểu cách thức hoạt động này, nhưng bây giờ tôi có một bài viết để biết cách đạt được mục tiêu này ít nhất.

http://thehappypath.net/2011/11/21/using-msdeploy-for-windows-services/

(chỉnh sửa:. Liên kết không còn tồn tại Hãy cho tôi biết nếu bạn quan tâm và tôi có thể gửi nó ở nơi khác).

dẫn tôi đi qua các bước tổng thể:

  • Đảm bảo các dịch vụ bắt đầu tự khi cài đặt (không quan trọng, nhưng dễ dàng hơn để đối phó với)
  • Thêm tập tin Microsoft.WebApplication.targets để dự án của bạn, mặc dù bạn không có dự án web. Điều này cho phép mục tiêu MsBuild Package.
  • Thêm một tùy chỉnh .targets nộp để dự án của bạn mà xây dựng một MSBuild gói tùy chỉnh manifest
  • Thêm một số kịch bản hàng loạt dự án của bạn để ngăn chặn/gỡ bỏ cài đặt và cài đặt dịch vụ
  • Thêm một tập tin Parameters.xml để hỗ trợ thay đổi thư mục triển khai đích dễ dàng hơn một chút
  • Thiết lập ứng dụng.biến đổi cấu hình sử dụng the SlowCheetah Visual Studio addon

Sau đó, bạn có thể gói dự án của bạn với dòng lệnh này:

msbuild MyProject.csproj /t:Package /p:Configuration=Debug 

Bạn có thể triển khai các gói kết quả với dòng lệnh này:

MyService.Deploy.cmd /Y /M:mywebserver -allowUntrusted 

Phần không có giấy tờ nhất của điều này (ngoại trừ hướng dẫn của tôi) đang tạo tệp kê khai tùy chỉnh. Dưới đây là một tập tin hiện tại của tôi (lưu ý, nó vẫn còn một chút lỗi, nhưng có thể được cố định - Xem câu hỏi này: MsDeploy remoting executing manifest twice - và cố gắng tiếp tục sử dụng chỉ tệp lô trực tiếp cho runCommand).

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" DefaultTargets="Build" 
     xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <!-- This file must be included before Microsoft.Web.Publishing.targets so we can hook into BeforeAddIisSettingAndFileContentsToSourceManifest --> 

    <PropertyGroup> 

    <!-- Include our targets --> 
    <IncludeStopServiceCommand>True</IncludeStopServiceCommand> 
    <IncludeSetCustomAclsProvider>True</IncludeSetCustomAclsProvider> 
    <IncludeInstallServiceCommand>True</IncludeInstallServiceCommand> 
    <IncludeMoveAppConfigToCorrectPackagePath>True</IncludeMoveAppConfigToCorrectPackagePath> 

    <!-- Uncomment to enable more verbose MsBuild logging --> 
    <!-- <EnablePackageProcessLoggingAndAssert>True</EnablePackageProcessLoggingAndAssert> --> 

    <!-- Enable web.config transform, but hack it to work for app.config --> 
    <ProjectConfigFileName>app.config</ProjectConfigFileName> 
    <TransformWebConfigEnabled>True</TransformWebConfigEnabled> 
    <UseParameterizeToTransformWebConfig>True</UseParameterizeToTransformWebConfig> 

    <!-- Enable web project packaging, but hack it to work for non-web app --> 
    <DeployAsIisApp>False</DeployAsIisApp> 
    <IncludeIisSettingsOnPublish>False</IncludeIisSettingsOnPublish> 
    <IncludeSetAclProviderOnDestination>False</IncludeSetAclProviderOnDestination> 
    <DisableAllVSGeneratedMSDeployParameter>True</DisableAllVSGeneratedMSDeployParameter> 

    <!-- Insert our custom targets into correct places in build process --> 
    <BeforeAddIisSettingAndFileContentsToSourceManifest Condition="'$(BeforeAddIisSettingAndFileContentsToSourceManifest)'==''"> 
     $(BeforeAddIisSettingAndFileContentsToSourceManifest); 
     AddStopServiceCommand; 
    </BeforeAddIisSettingAndFileContentsToSourceManifest> 

    <AfterAddIisSettingAndFileContentsToSourceManifest Condition="'$(AfterAddIisSettingAndFileContentsToSourceManifest)'==''"> 
     $(AfterAddIisSettingAndFileContentsToSourceManifest); 
     AddSetCustomAclsProvider; 
     AddInstallServiceCommand; 
    </AfterAddIisSettingAndFileContentsToSourceManifest> 

    <OnAfterCopyAllFilesToSingleFolderForPackage Condition="'$(OnAfterCopyAllFilesToSingleFolderForPackage)'==''"> 
     $(OnAfterCopyAllFilesToSingleFolderForPackage); 
     MoveAppConfigToCorrectPackagePath; 
    </OnAfterCopyAllFilesToSingleFolderForPackage> 

    </PropertyGroup> 

    <!-- Custom targets --> 
    <Target Name="AddStopServiceCommand" Condition="'$(IncludeStopServiceCommand)'=='true'"> 
    <Message Text="Adding runCommand to stop the running Service" /> 
    <ItemGroup> 

     <MsDeploySourceManifest Include="runCommand"> 
     <path>$(_MSDeployDirPath_FullPath)\bin\servicestop.bat</path> 
     <waitInterval>20000</waitInterval> 
     <AdditionalProviderSettings>waitInterval</AdditionalProviderSettings> 
     </MsDeploySourceManifest> 

    </ItemGroup> 
    </Target> 

    <Target Name="AddSetCustomAclsProvider" Condition="'$(IncludeSetCustomAclsProvider)'=='true'"> 
    <ItemGroup> 

     <MsDeploySourceManifest Include="setAcl"> 
     <Path>$(_MSDeployDirPath_FullPath)</Path> 
     <setAclUser>LocalService</setAclUser> 
     <setAclAccess>FullControl</setAclAccess> <!-- Todo: Reduce these permissions --> 
     <setAclResourceType>Directory</setAclResourceType> 
     <AdditionalProviderSettings>setAclUser;setAclAccess;setAclResourceType</AdditionalProviderSettings> 
     </MsDeploySourceManifest> 

    </ItemGroup> 
    </Target> 

    <Target Name="AddInstallServiceCommand" Condition="'$(IncludeInstallServiceCommand)'=='true'"> 
    <Message Text="Adding runCommand to install the Service" /> 
    <ItemGroup> 

     <MsDeploySourceManifest Include="runCommand"> 
     <path>cmd.exe /c $(_MSDeployDirPath_FullPath)\bin\serviceinstall.bat</path> 
     <waitInterval>20000</waitInterval> 
     <dontUseCommandExe>false</dontUseCommandExe> 
     <AdditionalProviderSettings>waitInterval;dontUseCommandExe</AdditionalProviderSettings> 
     </MsDeploySourceManifest> 

    </ItemGroup> 
    </Target> 

    <Target Name="MoveAppConfigToCorrectPackagePath" 
      Condition="'$(IncludeMoveAppConfigToCorrectPackagePath)'=='true'"> 
    <PropertyGroup> 
     <OriginalAppConfigFilename>$(_PackageTempDir)\App.Config</OriginalAppConfigFilename> 
     <TargetAppConfigFilename>$(_PackageTempDir)\bin\$(TargetFileName).config</TargetAppConfigFilename> 
    </PropertyGroup> 

    <Copy SourceFiles="$(OriginalAppConfigFilename)" DestinationFiles="$(TargetAppConfigFilename)" 
      Condition="Exists($(OriginalAppConfigFilename))" /> 
    <Delete Files="$(OriginalAppConfigFilename)" 
      Condition="Exists($(OriginalAppConfigFilename))" /> 
    </Target> 

</Project> 
+0

Tại sao bạn bao gồm trong các bước liệt kê các giá trị ban đầu của chúng, khi trước đó bạn xác nhận rằng chúng trống? Có thực sự là do cái gì đó ghê tởm? Ý tôi là, một số thuộc tính trông giống như ' $ (prop); tiện ích mở rộng ', do đó, cả hai đều 'sử dụng nếu không được đặt' và 'tiêm chích, không ghi đè'. Mẫu của bạn chỉ tự nó đính kèm nếu không có gì khác được đính kèm, và đồng thời nó cố gắng bảo toàn nội dung gốc (được giả định để trống trực tiếp trước nó). Tôi nghĩ rằng điều kiện đó, hoặc hành vi 'concat' là không cần thiết. – quetzalcoatl

+0

Dù sao, công việc tuyệt vời! Tôi chỉ đến một bản vá/phần mở rộng tương tự trước khi tìm đoạn trích của bạn, vì vậy có lẽ đó là cách duy nhất. Btw. Tôi cũng đã tìm thấy 'TransformWebConfigEnabled' để có' true' theo mặc định, vì vậy có lẽ nó cũng có thể được cắt bớt. Btw2. bạn đã thử tham số hóa của app.config chưa? Không có vấn đề gì với việc áp dụng các giá trị từ 'SetParameters.xml' do thực tế là' webconfig/appconfig' đã được di chuyển và đổi tên? – quetzalcoatl

+0

Hm .. Có, tôi chắc chắn sẽ có vấn đề, vì có tham chiếu rõ ràng đến 'App.config' cũ trong 'parameters.xml' bên trong gói.Tôi nghĩ rằng một số sửa chữa bổ sung là cần thiết để 'ImportParametersFiles' mục tiêu, hoặc gần đó. – quetzalcoatl

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