运行 来宾可执行文件中的节点模块
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 来检查该应用程序包是否在您的本地计算机上有效?
通常顺丰希望文件是
- 存在于应用程序包中并且
- OS 理解的某种可执行文件(对于 windows .bat、.exe 等)
在这种情况下,我认为你所说的是 tileserver 位实际上在包之外(无论你的节点包在哪里),你实际上是在尝试使用 node 来启动它(因为 tileserver-gl 包不能被 Windows 本机执行)。
如果是这种情况,您的程序可能应该类似于一个批处理文件,其中只包含 "tileserver-gl-light" 然后是您的命令行参数。
将该批处理文件包含在您的代码包中并将其作为您的程序引用(并弄清楚您希望如何传递 args),您应该可以开始了。
正如@masnider 指出的那样,文件必须存在于应用程序包中,并且我们必须按照 OS 理解的方式调用可执行文件。这对节点模块提出了特殊的挑战:
- 它们必须用 .bat 包起来
- 无法使用全局命令调用它们
- 他们需要参数
- 他们的文件,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 文件。
这样做会导致服务结构来宾可执行文件中的节点应用程序正常工作。
我已经安装了一个全局 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 来检查该应用程序包是否在您的本地计算机上有效?
通常顺丰希望文件是
- 存在于应用程序包中并且
- OS 理解的某种可执行文件(对于 windows .bat、.exe 等)
在这种情况下,我认为你所说的是 tileserver 位实际上在包之外(无论你的节点包在哪里),你实际上是在尝试使用 node 来启动它(因为 tileserver-gl 包不能被 Windows 本机执行)。
如果是这种情况,您的程序可能应该类似于一个批处理文件,其中只包含 "tileserver-gl-light" 然后是您的命令行参数。
将该批处理文件包含在您的代码包中并将其作为您的程序引用(并弄清楚您希望如何传递 args),您应该可以开始了。
正如@masnider 指出的那样,文件必须存在于应用程序包中,并且我们必须按照 OS 理解的方式调用可执行文件。这对节点模块提出了特殊的挑战:
- 它们必须用 .bat 包起来
- 无法使用全局命令调用它们
- 他们需要参数
- 他们的文件,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 文件。
这样做会导致服务结构来宾可执行文件中的节点应用程序正常工作。