我安装了全局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>
不幸的是,我在尝试运行服务时遇到的错误只是说“存在部署错误。继续吗?”
有关如何使其发挥作用的任何想法?
谢谢!
答案 0 :(得分:3)
您是否可以通过调用Test-ServiceFabricApplicationPackage来检查该应用程序包是否在本地计算机上验证?
通常SF希望文件为
在这种情况下,我认为您所说的是tileserver位实际上在包外(节点包的任何地方),并且您实际上正在尝试使用节点启动它(因为tileserver-gl包不能由Windows本机执行)。
如果是这样的话,你的程序可能就像批处理文件那样只是说&#34; tileserver-gl-light&#34;然后你的命令行args在其中。
在您的代码包中包含该批处理文件,并将其作为您的程序引用(并理清您希望如何传递args),您应该很高兴。
答案 1 :(得分:2)
正如@masnider指出的那样,文件必须存在于应用程序包中,我们必须将操作系统理解为可执行文件。这对节点模块提出了特殊的挑战:
我的最终服务具有以下文件结构:
- 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虚拟机可执行文件中生成正常工作的节点应用程序。