Service Fabric 包含其他文件

Service Fabric include additional files

我有一个包含以下内容的 Visual Studios 解决方案:

无状态服务项目使用基于配置的依赖注入,这意味着依赖与项目本身松散耦合,而不是实际的 VS "project/compilation dependencies"。

我想继续使用 Visual Studios,但是当我部署这个项目时它不知道程序集依赖项(因为这些仅在 DI 配置中定义)因此它没有打包必要的文件并抛出异常试图执行依赖注入。

在 ApplicationManifest.xml 文件或 Visual Studios 提供的其他许多 XML 文件中是否有任何方法可以指定要发布到服务的其他文件(即我的依赖程序集) Fabric 作为部署的一部分?

理想情况下,我希望自动生成此文件作为我的自动构建脚本的一部分。

为了将此行为封装到服务项目本身中,您可以编辑服务的项目文件以包含 MSBuild 逻辑,该逻辑将 CopyToOutputDirectory 设置为 Always 或 PreserveNewest 的项目动态包含 项。这些项目将根据您的 DI 的配置在构建时动态包含。由于服务项目 "declaring" 具有这些内容项,因此它们将被复制到服务的包文件夹中。

另一种选择是在打包步骤中在应用程序项目中添加逻辑。您可以像这样实现一个目标:

<Target Name="AfterPackage" AfterTargets="Package">
  <!-- Copy dependency files to service package location -->
</Target>

您的逻辑将执行相同类型的 DI 配置读取,但不是添加 项,它只是将文件复制到应用程序包中的适当位置,其路径由 $( PackageLocation).

根据上面 Matt 的建议,我在我的 sfproj 中使用它来复制我的应用程序所需的一些本机 dll。以防万一有人有同样的用例:

<Target Name="AfterPackage" AfterTargets="Package">
    <Copy SourceFiles="ApplicationPackageRoot\mynative.dll" DestinationFolder="$(PackageLocation)\MyServicePkg\Code"/>
  </Target>

这是应对整个 Guest Executable 文件夹的解决方案,感谢 Matt 和 AdamC

<Target Name="AfterPackage" AfterTargets="Package">
  <ItemGroup>
    <ExamapleServiceDir Include="$(SolutionDir)\ExamapleService\**\*" />
  </ItemGroup>
  <Copy 
    SourceFiles="@(ExamapleServiceDir)" 
    DestinationFiles="@(ExamapleServiceDir->'$(PackageLocation)\ExamapleServicePkg\Code\%(RecursiveDir)%(Filename)%(Extension)')" 
    SkipUnchangedFiles="true" 
    OverwriteReadOnlyFiles="true" 
    Retries="3" 
    RetryDelayMilliseconds="300" />
</Target>
DestinationFiles="@(ExamapleServiceDir->'$(ProjectDir)\ApplicationPackageRoot\ExamapleServicePkg\Code\%(RecursiveDir)%(Filename)%(Extension)')" 

如果您不喜欢 SF 投诉每次发布都会更改服务 pkg

它比 内容链接 有很大的优势,因为它不会降低 VS 性能(在我的项目中打开上下文 window 需要 5 秒,OMG)

<Content Include="..\ExamapleService\**\*.*">
  <Link>ApplicationPackageRoot\ExamapleServicePkg\Code\%(RecursiveDir)%(Filename)%(Extension)</Link>
</Content>