【问题标题】:Run node module in guest executable在来宾可执行文件中运行节点模块
【发布时间】:2018-09-01 07:18:04
【问题描述】:

我已经安装了一个全局 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>

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

关于如何让它发挥作用的任何想法?

谢谢!

【问题讨论】:

标签: azure-service-fabric


【解决方案1】:

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

通常 SF 期望文件是

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

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

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

在您的代码包中包含该批处理文件并将其作为您的程序引用(并理清您希望如何传递参数),您应该一切顺利。

【讨论】:

  • 这为我指明了正确的方向,尤其是上面的#2。因此,我已将此标记为已接受的答案。我将在下面提供一个模式详细的答案,因为这种特殊情况存在一些细微差别。谢谢!
  • 很高兴它有帮助!
【解决方案2】:

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

  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 文件。

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

【讨论】:

    猜你喜欢
    • 2020-08-12
    • 2018-10-04
    • 2019-04-26
    • 2016-12-10
    • 1970-01-01
    • 2016-09-19
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多