Azure service fabric 在来宾可执行文件中运行节点模块

Azure service fabric 在来宾可执行文件中运行节点模块,azure-service-fabric,Azure Service Fabric,我已经安装了一个全局npm包,通过命令行作为服务运行。我想将其转换为service fabric中的来宾可执行文件,但在实现时遇到了问题 在来宾可执行文件之前,我将在cmd中调用以下命令: tileserver-gl-light --port=8788 map.mbtiles 我的来宾可执行文件的配置为: <ExeHost> <Program>tileserver-gl-light</Program> <Arguments>--port=

我已经安装了一个全局npm包,通过命令行作为服务运行。我想将其转换为service fabric中的来宾可执行文件,但在实现时遇到了问题

在来宾可执行文件之前,我将在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>

tileserver gl灯
--端口=8788 c:\maptiles.mbtiles
工作
不幸的是,我在尝试运行服务时遇到的错误只是说“有部署错误。是否继续?”

有什么办法让它工作吗


谢谢

您能否通过调用Test ServiceFabricApplicationPackage检查该应用程序包是否在本地计算机上进行验证

通常SF希望文件

  • 在应用程序包和
  • 操作系统能够理解的某种可执行文件(适用于windows.bat、.exe等)
  • 在本例中,我认为您所说的是tileserver位实际上在包之外(无论您的节点包在哪里),并且您实际上试图使用节点启动它(因为tileserver gl包不是Windows本机可执行的)

    如果是这种情况,那么您的程序可能应该类似于一个只显示“tileserver gl light”的批处理文件,然后您的命令行参数在其中


    在代码包中包含该批处理文件,并将其作为程序引用(并理顺您希望传递args的方式),这样您就可以开始了

    正如@masnider所指出的,文件必须存在于应用程序包中,并且我们必须调用操作系统理解的可执行文件。这给节点模块带来了特殊的挑战,如:

  • 它们必须用蝙蝠包裹起来
  • 不能使用全局命令调用它们
  • 它们需要参数
  • 这些文件(节点单元模块)通常存在文件路径长度问题
  • 我的最终服务具有以下文件结构:

    - ApplicationPackageRoot
      - MyService.ServicePkg
       - Code
         - 7za.exe
         - node.exe
         - npm.7z
         - start.bat
    
    My 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>
    
    那么这是如何工作的呢?代码中的npm.7z由预先压缩的node_模块组成。7za是7zip的可移植版本,可用于解决windows上存在的文件路径长度问题。7za在SetupEntryPoint中调用

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


    这样做会使service fabric来宾可执行文件中的节点应用程序正常工作。

    此链接可能会有所帮助:这为我指明了正确的方向,尤其是上面的#2。因此,我将此标记为已接受的答案。我将在下面提供一个详细的答案,因为对于这个特殊的案例有一些细微的差别。谢谢很高兴它有帮助!
    .\node.exe npm/node_modules/tileserver-gl-light/sc/main.js --port=%Port% %TilePath%