在来宾可执行文件

时间:2018-03-22 18:08:48

标签: azure-service-fabric

我安装了全局npm软件包TileServer,我通过命令行作为服务运行。我想将它转换为服务结构中的guest虚拟机可执行文件,但是我无法实现。

Pre-Guest可执行文件,我将在cmd中调用以下命令:

tileserver-gl-light --port=8788 map.mbtiles

我的访客可执行文件的配置是:

<ExeHost>
  <Program>tileserver-gl-light</Program>
  <Arguments>--port=8788 c:\maptiles.mbtiles</Arguments>
  <WorkingFolder>Work</WorkingFolder>
</ExeHost>

不幸的是,我在尝试运行服务时遇到的错误只是说“存在部署错误。继续吗?

有关如何使其发挥作用的任何想法?

谢谢!

2 个答案:

答案 0 :(得分:3)

您是否可以通过调用Test-ServiceFabricApplicationPackage来检查该应用程序包是否在本地计算机上验证?

通常SF希望文件为

  1. 出现在应用程序包中,
  2. 操作系统理解的某种可执行文件(适用于Windows .bat,.exe等)
  3. 在这种情况下,我认为您所说的是tileserver位实际上在包外(节点包的任何地方),并且您实际上正在尝试使用节点启动它(因为tileserver-gl包不能由Windows本机执行)。

    如果是这样的话,你的程序可能就像批处理文件那样只是说&#34; tileserver-gl-light&#34;然后你的命令行args在其中。

    在您的代码包中包含该批处理文件,并将其作为您的程序引用(并理清您希望如何传递args),您应该很高兴。

答案 1 :(得分:2)

正如@masnider指出的那样,文件必须存在于应用程序包中,我们必须将操作系统理解为可执行文件。这对节点模块提出了特殊的挑战:

  1. 必须用.bat
  2. 包装
  3. 无法使用全局命令
  4. 调用它们
  5. 他们需要参数
  6. 他们的文件node_modules经常出现文件路径长度问题
  7. 我的最终服务具有以下文件结构:

    - ApplicationPackageRoot
      - MyService.ServicePkg
       - Code
         - 7za.exe
         - node.exe
         - npm.7z
         - start.bat
    

    我的ServiceManifest.xml中包含以下值:

    <SetupEntryPoint>
      <ExeHost>
        <Program>7za.exe</Program>
        <Arguments>x npm.7z<Arguments>
        <WorkingFolder>CodeBase</WorkingFolder>
      </ExeHost>
    </SetupEntryPoint>
    
    <EntryPoint>
      <ExeHost>
        <Program>start.bat</Program>
        <Arguments><Arguments>
        <WorkingFolder>CodeBase</WorkingFolder>
      </ExeHost>
    
      <EnvironmentVariables>
        <EnvironmentVariable Name="Port" Value="8788"/>
        <EnvironmentVariable Name="TilePath" Value="mytiles.mbtiles"/>
      </EnvironmentVariables>
    </EntryPoint>
    

    最后,我的start.bat由以下行组成:

    .\node.exe npm/node_modules/tileserver-gl-light/sc/main.js --port=%Port% %TilePath%
    

    那么这是如何工作的?代码中的npm.7z由我的node_modules组成,预先压缩。 7za是7zip的便携版本,允许用来解决Windows上存在的文件路径长度问题。在SetupEntryPoint中调用7za。

    然后SF调用start.bat,它读取Port和TilePath的环境变量。这必须调用普通的tileserver-gl-light命令调用的正好.js文件。

    执行此操作会在服务结构guest虚拟机可执行文件中生成正常工作的节点应用程序。