Service Fabric包含其他文件

时间:2016-05-17 13:49:03

标签: c# azure dependency-injection azure-service-fabric

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

  • Service Fabric项目
  • 无国籍服务项目

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

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

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

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

3 个答案:

答案 0 :(得分:9)

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

另一种选择是在Package步骤中在Application项目中添加逻辑。您可以像这样实现目标:

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

你的逻辑会对你的DI配置进行相同类型的读取,而不是添加&lt; Content&gt; items,它只是将文件复制到应用程序包中的适当位置,其路径由$(PackageLocation)定义。

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

这是处理整个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)')" 

如果你不喜欢顺丰对Service pkg的抱怨每次发布都会改变

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

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