使用云配置(ServiceDefinition.csdef)文件的配置创建Nuget包

时间:2011-12-02 06:53:21

标签: azure nuget-package

我想为我的附加组件构建Nuget包,最终用户将使用它作为启动任务进行安装,之后他们将在窗口azure平台上上传他们的应用程序。

我们现在使用一个简单的Web应用程序和一个云项目,使用Nuget最终用户将添加附加软件包,它将在Web应用程序项目中添加2个文件(exe& config)。将启动任务添加到云项目的ServiceDefinition.csdef中,如图所示

enter image description here

我如何创造这种类型的Nuget Pacakge?

提前致谢。

更新

我已经根据NICK的回答尝试了但是我在云项目中遇到了2个webrole的问题,如下图所示。 Cloud project with 2 webrole 和错误我得到如下

error to add startup task with powershell script

另外我有一个问题,如果我用命令行安装Nuget包,那我怎么能考虑所有webrole项目在解决方案中添加exe和配置文件?

1 个答案:

答案 0 :(得分: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内容(用于配置)
  2. 你要为exe做的只是将文件放在lib目录中,并在元数据节点下修改.nuspec文件。应该有一个“文件”节点(如果没有,你可以添加一个)。在文件节点中添加类似的内容:

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

    配置略有不同。只需将名为myname.config.transform的文件添加到内容目录,然后在.nuspec文件中添加一个条目:

    有几点需要注意:

    1. 如果您的应用中不存在配置文件,则会为您添加一个。
    2. 如果存在已存在的文件,则只需添加要转换的节点
    3. 转换文件将在您的节点上完成匹配,因此如果
    4. 中存在以下内容

      你的配置文件:

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

      在你的改造中,你有:

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

      生成的文件如下所示:

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

      至于添加启动任务,这对我来说有点棘手(可能有更好的方法)。我在install.ps1中使用了powershell(就像上面的文件一样,但你为它创建了一个“tools”目录):

      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);
      

      我希望这会有所帮助。

      - 尼克