2011-12-02 39 views
1

我想爲我的插件構建Nuget包,最終用戶將使用它安裝爲啓動任務,之後他們將上載其應用程序窗口天藍色的平臺。用配置的雲配置(ServiceDefinition.csdef)文件創建Nuget Pacakge

讓我們舉一個簡單的Web應用程序和一個雲計算項目現在使用的NuGet終端用戶將增加附加軟件包這將增加在Web應用程序項目2個文件(EXE &配置)&啓動任務添加到雲項目的ServiceDefinition.csdef中按如圖

enter image description here

我怎樣才能創建這種類型的NuGet Pacakge的?

在此先感謝。

更新:

我與尼克的回答不過我在雲項目根據下圖所示越來越問題2 webrole根據審判。 Cloud project with 2 webrole 和錯誤我收到按以下

error to add startup task with powershell script

我也有一個問題,如果我安裝的是NuGet包帶命令行,然後我怎麼可以考慮所有webrole項目添加EXE和配置文件在解決方案??根據慣例

回答

3

的NuGet包工作: http://docs.nuget.org/docs/creating-packages/creating-and-publishing-a-package#From_a_convention_based_working_directory

至於EXE和配置,你可以做到以下幾點:

  1. 在你的包目錄中進行以下目錄
    • 的mkdir lib(用於exe)
    • mkdir內容(用於配置)

所有你需要爲exe執行的操作是將文件放在lib目錄中,然後修改你的元數據節點下的.nuspec文件。應該有一個「文件」節點(如果不是,你可以添加一個)。在文件節點內添加如下內容:

<file src="content\my.exe" target="content\my.exe" /> 

配置有點不同。只需添加一個名爲myname.config.transform的內容目錄文件並添加一個條目到.nuspec文件:

幾件事情需要注意:

  1. 如果配置文件不存在中你的應用程序會爲你添加一個。
  2. 你只需要添加你要轉換的節點,如果有已經存在這樣如果在

您的配置文件下面存在

  • 轉換文件將做您的節點上的完全匹配文件:

    <add key="test" value="myval"/> 
    

    而在你改變你有:

    <add key="test" value="myval2"/> 
    

    生成的文件看起來像:

    <add key="test" value="myval"/> 
    <add key="test" value="myval2"/> 
    

    至於添加啓動任務,這對我來說有點複雜點(有可能是一個更好的方法)。我使用PowerShell在install.ps1(就像上面的文件,但創建一個「工具」目錄的話):

    param($installPath, $toolsPath, $package, $project) 
    
    #Modify the service config - adding a new Startup task 
    $svcConfigFile = $DTE.Solution.Projects|Select-Object -Expand ProjectItems|Where-Object{$_.Name -eq 'ServiceDefinition.csdef'} 
    $ServiceDefinitionConfig = $svcConfigFile.Properties.Item("FullPath").Value 
    [xml] $xml = gc $ServiceDefinitionConfig 
    
    #Create startup and task nodes 
    
    # So that you dont get the blank ns in your node 
    $startupNode = $xml.CreateElement('Startup','http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition') 
    $taskNode = $xml.CreateElement('Task','http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition') 
    $taskNode.SetAttribute('commandLine','my.exe') 
    $taskNode.SetAttribute('executionContext','elevated') 
    $taskNode.SetAttribute('taskType','simple') 
    $startupNode.AppendChild($taskNode) 
    
    #Check to see if the startup node exists 
    $modified = $xml.ServiceDefinition.WebRole.StartUp 
    if($modified -eq $null){ 
        $modified = $xml.ServiceDefinition.WebRole 
        $modified.PrependChild($startupNode) 
    } 
    else{ 
        $nodeExists = $false 
        foreach ($i in $xml.ServiceDefinition.WebRole.Startup.Task){ 
         if ($i.commandLine -eq 'my.exe'){ 
          $nodeExists = $true 
         } 
        } 
        if($taskNode -eq $null -and !$nodeExists){ 
         $modified.AppendChild($taskNode) 
        } 
    } 
    $xml.Save($ServiceDefinitionConfig); 
    

    我希望這可以幫助了。

    - 尼克

  • +0

    感謝尼克斯的幫助。它可以很好地工作,但是我在這個雲計劃中有2個webrole的問題。你能看到我更新的問題嗎? –

    +0

    爲了清楚起見,您想要將啓動任務添加到兩個WebRoles中?如果是這樣,你可以嘗試像這樣:'foreach($ i in $ xml.ServiceDefinition.ChildNodes){ \t \t#addd task logic here \t}'' – Nick