运行 来宾可执行文件中的节点模块

Run node module in guest executable

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

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>

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

关于如何让它工作有什么想法吗?

谢谢!

您能否通过调用 Test-ServiceFabricApplicationPackage 来检查该应用程序包是否在您的本地计算机上有效?

通常顺丰希望文件是

  1. 存在于应用程序包中并且
  2. OS 理解的某种可执行文件(对于 windows .bat、.exe 等)

在这种情况下,我认为你所说的是 tileserver 位实际上在包之外(无论你的节点包在哪里),你实际上是在尝试使用 node 来启动它(因为 tileserver-gl 包不能被 Windows 本机执行)。

如果是这种情况,您的程序可能应该类似于一个批处理文件,其中只包含 "tileserver-gl-light" 然后是您的命令行参数。

将该批处理文件包含在您的代码包中并将其作为您的程序引用(并弄清楚您希望如何传递 args),您应该可以开始了。

正如@masnider 指出的那样,文件必须存在于应用程序包中,并且我们必须按照 OS 理解的方式调用可执行文件。这对节点模块提出了特殊的挑战:

  1. 它们必须用 .bat 包起来
  2. 无法使用全局命令调用它们
  3. 他们需要参数
  4. 他们的文件,node_modules,经常有文件路径长度问题

我的最终服务具有以下文件结构:

- 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 上存在的文件路径长度问题。 7za 在 SetupEntryPoint 中被调用。

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

这样做会导致服务结构来宾可执行文件中的节点应用程序正常工作。