我正在尝试升级我的应用程序:
失败并出现以下错误:
错误详情:
2> Test-ServiceFabricApplicationPackage:应用程序的BuildLayout 2> C:\ Users \ me \ AppData \ Local \ Temp \ TestApplicationPackage_2205895293421 \ 4myc2vpp.bdq \ Debug无效。代码是
2>服务MyServicePkg缺失。
2>在C:\ Program Files \ Microsoft SDKs \ Service
2> Fabric \ Tools \ PSModule \ ServiceFabricSDK \ Publish-UpgradedServiceFabricApplication.ps1:135 char:38
2> + ... nSuccess =(Test-ServiceFabricApplicationPackage $ AppPkgPathToUse -Im ...
2> + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~
2 - ; + CategoryInfo:InvalidOperation:(:) [Test-ServiceFabricApplicationPackage],FabricImageBuilderValidati
2 - ; onException的
2 - ; + FullyQualifiedErrorId:TestApplicationPackageErrorId,Microsoft.ServiceFabric.Powershell.TestApplicationPackage 2 - ;
2>完成执行脚本'Deploy-FabricApplication.ps1' 2>时间流逝:00:00:40.4035177
2> PowerShell脚本无法执行 ==========构建:1成功,0失败,46最新,0跳过==========
==========发布:0成功,1失败,0跳过==========
以下是该特定项目的属性:
答案 0 :(得分:3)
我会选择Hans Passant的评论:
最基本的不幸是你在名字中使用的名字 ServiceManifest.xml文件与您的.exe名称不匹配 项目生成
在调试输出中也可以看到它,因为构建成功但发布失败。
==========构建:1成功,0失败,46最新,0跳过========== ==========发布:0成功,1失败,0跳过==========
它可能以多种方式发生,很可能是由于重命名项目或重命名Assembly Name
。如果重命名项目或项目的Assembly Name
,则构建可执行文件将根据该名称。请考虑以下情况。
我将Assembly Name
从“MyService”重命名为“MyRenamedService”。因此构建可执行文件将是MyRenamedService.exe
。因此,您必须在ServiceManifest.xml
。
<CodePackage Name="Code" Version="1.0.0">
<EntryPoint>
<ExeHost>
<Program>MyRenamedService.exe</Program>
<WorkingFolder>CodePackage</WorkingFolder>
</ExeHost>
</EntryPoint>
</CodePackage>
确保构建可执行路径的最佳方法是构建解决方案。它将在“输出”窗口中显示可执行文件的完整路径。
1>------ Build started: Project: Web1, Configuration: Debug Any CPU ------
1>Web1 -> C:\.....\Application2\Web1\bin\Debug\net461\win7-x64\MyRenamedService.exe
2>------ Build started: Project: Application2, Configuration: Debug x64 ------
========== Build: 2 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
这里Web1
是我开始使用的项目名称,MyRenamedService.exe
是构建可执行文件名(因为我重命名了程序集名称),它应该在ServiceManifest.xml
中设置,如上所示
答案 1 :(得分:2)
在更高级别,当发布期间ServiceFabric项目文件夹下缺少名为“Code”的文件夹时(构建显示为成功完成后),会发生此错误。
构建是这里的罪魁祸首,而不是Publish,因为Publish应该寻找资产 Folder Path: {{SFProjectFolder}}\pkg\Release\{{ServiceName}}
请注意,{{ServiceName}}和“Code”取自SF应用程序中引用的相应项目的ServiceManifest.xml。
<ServiceManifest xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="{{ServiceName}}" Version="1.0.0" xmlns="http://schemas.microsoft.com/2011/01/fabric">
<ServiceTypes>
<StatelessServiceType ServiceTypeName="{{ServiceType}}" />
</ServiceTypes>
<CodePackage Name="Code" Version="1.0.0">
<EntryPoint>
<ExeHost>
<Program>{{ServiceName}}.exe</Program>
</ExeHost>
</EntryPoint>
</CodePackage>
<ConfigPackage
导致问题的原因 : 从其他答案看,看起来Build不会将编译后的资产复制到正确的路径/文件夹中,可能由于多个问题而发生。 在我们的示例中,我们已将Release Configuration的Configuration Manager设置从AnyCPU更改为x64,并从解决方案中删除了AnyCPU Platform设置。由于某种原因,Services.csproj仍然具有AnyCPU平台设置。我们最终让构建显示为成功,但“Release”文件夹未在Release文件夹下生成。
<强> 修正 强>:
要解决此问题,我们必须手动编辑.csproj并删除仍使用“AnyCPU”的PropertyGroup部分,如下所示:
PropertyGroup Condition =“'$(Configuration)| $(Platform)'=='Release | AnyCPU'”
在此更改之后,Build正确地将内容放在正确的路径中,Publish按预期工作。
答案 2 :(得分:1)
当 ServiceManifest.xml 中的服务的可执行.exe
路径出错时,会出现此问题。
<CodePackage>
在.exe
中包含<Program>
路径,请先检查一下:
<CodePackage Name="Code" Version="1.0.0">
<EntryPoint>
<ExeHost>
<Program>MyServicePkgHost.exe</Program> // Important
<WorkingFolder>CodePackage</WorkingFolder>
</ExeHost>
</EntryPoint>
</CodePackage>
重要参考资料:
如果确认您没有遗漏任何内容,请查看two tutorials下面的内容:
您的package layout应用程序目录结构应为:
PS D:\temp> tree /f .\MyServicePkg
D:\TEMP\MYSERVICEPKG
│ ApplicationManifest.xml
│
└───MyServicePkgManifest
│ ServiceManifest.xml
│
├───MyServicePkg
│ MyServicePkgHost.exe
│
├───MyServicePkgConfig
│ Settings.xml
│
└───MyServicePkgData
init.dat
错误:
为什么服务包&#34; 缺少&#34;代码?
原因:
在上面的目录中,缺少来自应用程序目录的.bat
代码文件:
│
├───MyServicePkg
│ MyServicePkgHost.exe
│ MyServicePkgSetup.bat
|
所以你必须添加那个丢失的文件MyServicePkgSetup.bat
。以下是一个简单的service manifest ServiceManifest.xml 示例,其中显示了该服务的SetupEntryPoint
和主EntryPoint
。
<?xml version="1.0" encoding="utf-8" ?>
<ServiceManifest Name="MyServiceManifest" Version="SvcManifestVersion1" xmlns="http://schemas.microsoft.com/2011/01/fabric" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Description>An example service manifest</Description>
<ServiceTypes>
<StatelessServiceType ServiceTypeName="MyServiceType" />
</ServiceTypes>
<CodePackage Name="Code" Version="1.0.0">
<SetupEntryPoint>
<ExeHost>
<Program>MyServicePkgSetup.bat</Program> // important
<WorkingFolder>CodePackage</WorkingFolder>
</ExeHost>
</SetupEntryPoint>
<EntryPoint>
<ExeHost>
<Program>MyServicePkgHost.exe</Program> // important
</ExeHost>
</EntryPoint>
</CodePackage>
<ConfigPackage Name="Config" Version="1.0.0" />
</ServiceManifest>
将服务配置为具有设置入口点后,您可以更改其在应用程序清单中运行的安全权限:
在<ServiceManifestImport>
部分下,配置策略以将此主体应用于<SetupEntryPoint>
。这告诉Service Fabric在运行MyServicePkgSetup.bat
文件时,它应该是具有管理员权限的 RunAs 。鉴于您尚未将策略应用于主入口点,MyServicePkgHost.exe
中的代码将在系统 NetworkService 帐户下运行。这是所有服务入口点都作为默认帐户运行。
<?xml version="1.0" encoding="utf-8"?>
<ApplicationManifest xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ApplicationTypeName="MyApplicationType" ApplicationTypeVersion="1.0.0" xmlns="http://schemas.microsoft.com/2011/01/fabric">
<ServiceManifestImport>
<ServiceManifestRef ServiceManifestName="MyServiceTypePkg" ServiceManifestVersion="1.0.0" />
<ConfigOverrides />
<Policies>
<RunAsPolicy CodePackageRef="Code" UserRef="SetupAdminUser" EntryPointType="Setup" />
</Policies>
</ServiceManifestImport>
<Principals>
<Users>
<User Name="SetupAdminUser">
<MemberOf>
<SystemGroup Name="Administrators" />
</MemberOf>
</User>
</Users>
</Principals>
</ApplicationManifest>
PS:您可以使用Test-ServiceFabricApplicationPackage命令通过PowerShell在本地验证包结构。
添加丢失文件MyServicePkgSetup.bat
的解决方法:
现在让我们将文件MyServicePkgSetup.bat
添加到Visual Studio项目以测试管理员权限。在Visual Studio中,右键单击服务项目并添加名为MyServicePkgSetup.bat
的新文件。
接下来,确保服务包中包含MyServicePkgSetup.bat
文件。默认情况下,它不是。选择文件,右键单击以获取上下文菜单,然后选择属性。在“属性”对话框中,确保复制到输出目录设置为复制更新。请参阅以下屏幕截图:
**文件路径:**
C:\..\YourApplication\
现在打开 MyServicePkgSetup.bat
文件并添加以下命令:
REM Set a system environment variable. This requires administrator privilege
setx -m TestVariable "MyValue"
echo System TestVariable set to > out.txt
echo %TestVariable% >> out.txt
REM To delete this system variable us
REM REG delete "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v TestVariable /f
接下来,构建解决方案并将其部署到本地开发群集。服务启动后,如Service Fabric Explorer中所示,您可以通过两种方式看到MySetup.bat文件成功。打开PowerShell命令提示符并键入:
PS C:\ [Environment]::GetEnvironmentVariable("TestVariable","Machine")
MyValue
然后,记下在Service Fabric Explorer中部署和启动服务的节点的名称 - 例如,节点2.接下来,导航到应用程序实例工作文件夹以查找out.txt文件显示TestVariable的值。例如,如果将此服务部署到节点2,那么您可以转到MyApplicationType的此路径:
C:\SfDevCluster\Data\_App\Node.2\MyApplicationType_App\work\out.txt