我终于弄明白了。我将在这里发布答案,但我也会顺便介绍一下在Windows上开发Service Fabric项目并在Linux上运行的所有步骤。
入口点
在SF项目的ServiceManifest.xml中,有一个EntryPoint/ExeHost/Program节点。在Windows中,它指向msbuild生成的exe文件。但在Linux上不是这样。
- 如果您没有安装npm,请先安装它。
- 运行
npm i -g yo
- 运行
npm i -g generator-azuresfcsharp
- 在测试文件夹中,运行
yo azuresfcsharp
当生成器运行时,它会给您一个SF项目文件夹和一个C#项目文件夹。进入SF项目/服务名称文件夹/Code。该文件夹中将有两个名为entryPoint.sh和dotnet-include.sh的文件。
您需要将它们添加到您的项目中,并设置为内容和始终复制。
最后,在ServiceManifest.xml中,将EntryPoint/ExeHost/Program节点更改为entryPoint.sh
编译
使用Visual Studio进行编译无法工作,因为您需要针对Linux运行时。
附注 - 在编译之前,您需要了解Service Fabric包的布局方式。最好的方法是在Visual Studio中右键单击SF项目,单击“Package”,转到资源管理器中的SF项目文件夹,然后查看其中的pkg文件夹。
在控制台窗口中,cd到具有要构建的服务的csproj文件的文件夹。假设您将部署包构建在名为pkg
的文件夹中,该文件夹位于解决方案的根目录中。因此运行:
dotnet publish -o ..\pkg\YourServicePkg\Code -r ubuntu.16.04-x64
注意 - 您的 pkg 文件夹必须以 Pkg 结尾。
另外,查看此处列出的可供定位的运行时列表。我刚好在使用 unbuntu。 运行时标识符
完成打包
最后,为了完善您的部署包,您需要在包文件夹的根目录中包含 ApplicationManifest.xml 文件,从您的服务项目中获取 ServiceManifest.xml 文件和 Config 文件夹。服务项目文件可以在 PackageRoot 中找到。
因此,您将拥有:
pkg
|
-> ApplicationManifest.xml
-> YourServicePkg
|
-> ServiceManifest.xml
-> Code (This is where you targeted dotnet publish)
-> Config
Linux环境
现在你需要本地运行它的地方。我使用了Docker。 这里 是完整设置说明的链接,但我会在这里概述基础知识。
首先,您需要使用以下设置更新Docker守护程序配置:
{
"ipv6": true,
"fixed-cidr-v6": "2001:db8:1::/64"
}
然后,拉取图片。
docker pull servicefabricoss/service-fabric-onebox
您需要打开端口19080和19000,使用以下命令:
-p 19080:19080 -p 19000:19000
如果您一直在使用Windows中的Service Fabric本地群集管理器,您需要右键单击系统托盘中的图标并单击“删除群集”。然后等待完成后退出。否则会发生奇怪的事情。
一旦docker镜像启动,打开它的bash并运行
./setup.sh
,然后是
./run.sh
部署
一旦SF在docker上运行并且您可以访问localhost:19080,就可以使用powershell进行部署。
首先,让我们测试我们的软件包是否有效。
Test-ServiceFabricApplicationPackage .\pkg\
如果这样可以的话,让我们部署。
Connect-ServiceFabricCluster localhost:19000
Register-ServiceFabricApplicationType -ApplicationPathInImageStore YourService
Remove-ServiceFabricApplicationPackage -ImageStoreConnectionString fabric:ImageStore -ApplicationPackagePathInImageStore YourService
New-ServiceFabricApplication -ApplicationName fabric:/YourService -ApplicationTypeVersion 1.0.0 -ApplicationTypeName YourServiceType
您的应用程序应在Linux中启动。
重要提示
以下是导致退出代码:32512错误的原因:
我正在使用GitHub,显然,行结束样式设置为Windows。 因此,当我在另一台计算机上拉取时,行结束符从LF更改为CR LF。
为了解决这个问题,我必须在Notepad++中打开受影响的文件,然后单击“编辑”->“EOL转换”->“Unix(LF)”。
我必须在ApplicationManifest.xml、所有ServiceManifest.xml文件以及所有entryPoint.sh和dotnet-include.sh文件中执行此操作。