我有一个包含以下内容的Visual Studios解决方案:
无状态服务项目使用基于配置的依赖注入,这意味着依赖项与项目本身松散耦合,而不是实际的VS"项目/编译依赖项"。
我想继续使用Visual Studios,但是当我部署这个项目时,它并不了解程序集依赖性(因为这些仅在DI配置中定义)因此它不会打包尝试执行依赖注入的必要文件和抛出异常。
ApplicationManifest.xml文件中是否有任何方法或Visual Studios提供的其他XML文件之一,我可以指定作为部署的一部分发布到Service Fabric的其他文件(即我的依赖程序集)?
理想情况下,我希望将此文件自动生成为自动构建脚本的一部分。
答案 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>