Microsoft.Web.WebJobs.Publish 在部署包中产生重复的程序集

Posted

技术标签:

【中文标题】Microsoft.Web.WebJobs.Publish 在部署包中产生重复的程序集【英文标题】:Microsoft.Web.WebJobs.Publish producing duplicate assemblies in deploy package 【发布时间】:2017-11-19 18:01:13 【问题描述】:

我有大量 Azure WebJobs,它们都部署到单个 Azure 应用服务,以及同一个 Azure 应用服务上的网站。每个 WebJob 都使用 WebJobs SDK 和 Microsoft.Web.WebJobs.Publish nuget 包(我们是最新的 1.0.13 版本)将它们打包以进行部署。以下是我们在 CI 构建 (VSTS) 中用于生成部署包的 MSBuild 参数:

/p:DeployOnBuild=true /p:PublishProfile=Release /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation=$(Build.StagingDirectory)

这会生成一个与“Azure Web Service Deploy”VSTS 任务一起正常工作的包(因为 WebJobs 作为 WebJobs 正确运行),这不是问题。

问题在于 .zip 文件包复制了所有 WebJob 程序集。这些副本最终会提供给 Azure 应用服务。

每个 WebJob 包的 .zip 文件中的文件夹结构为:

- Content/[build agent full path]/
     - app_data/jobs/continuous/[web job name]/[assembly files]
     - bin/[assembly files]

这导致问题有 3 个原因:

    我们已开始调查与安全供应商合作,该供应商将对我们的部署包执行静态分析。这种重复会导致报告问题。 由于 bin/[assembly files] 用于应用服务,因此它们与网站的程序集混合在一起,该网站也部署到相同的应用服务。 通过在这些部署包中转移所有这些额外的膨胀,我们的构建/发布时间变慢了。我的团队实践持续交付,并希望管道快速

那么为什么除了必需的app_data/jobs/continuous/[WebJobName]/[assembly files] 之外,Microsoft.Web.WebJobs.Publish 包还添加了bin/[assembly files]?还有更重要的是,如何防止打包过程中包含bin/[assembly files]

我真的很讨厌必须添加构建步骤来拆分压缩包并将其重新组合在一起而不会产生额外的垃圾,或者必须想办法手工制作发布包。您有 1 份工作,Microsoft.Web.WebJobs.Publish! :)

【问题讨论】:

【参考方案1】:

我更新到https://***.com/a/44611520/8654143

我必须为现有目标添加多个覆盖才能使其工作:

<Target Name="CollectFilesFromContent" />
<Target Name="CollectFilesFromReference" />
<Target Name="CollectFilesFromIntermediateAssembly" />
<Target Name="CollectFilesFrom_SourceItemsToCopyToOutputDirectory" />

如何找到它?

1) 使用 /verbosity:diag 运行 msbuild

2) 检查日志并查找DestinationRelativePath=bin;会有相关条目FromTarget=SomeTargetName

3) 将&lt;Target Name="SomeTargetName" /&gt; 添加到您的.csproj

您应该以带有FromTarget=PublishWebJob 标记的条目结束。

我认为可以以某种方式过滤FilesForPackagingFromProject 变量的内容(可能覆盖CustomCollectFiles 目标并在那里修改FilesForPackagingFromProject)但我不知道msbuild 足够好。

【讨论】:

这对我有用!我从 Microsoft.Web.WebJobs.Publish‌​.1.0.11 升级到 Microsoft.Web.WebJobs.Publish‌​.1.1.0 并且没有修复。所以,我不得不添加&lt;Target Name="CollectFilesFromReference" /&gt;&lt;Target Name="CollectFilesFromIntermediateAssembly" /&gt;。谢谢!【参考方案2】:

很遗憾得知您遇到了这个问题。作为临时解决方法,您可以在 csproj 中覆盖此目标(CollectFilesFromIntermediateAssembly)。这将阻止文件发布到 bin 文件夹。

这里的示例: https://github.com/vijayrkn/ASPNetPublishSamples/blob/master/WebJobFullFramework/WebJobFullFramework.csproj#L56-L57

我们将很快在 WebJobs.Publish NuGet 包中解决此问题。

【讨论】:

我现在正在尝试这种解决方法,但如果即将进行永久性修复,我会拒绝将其标记为答案(当有人告诉我哪个官方版本的软件包将修复此问题时,我宁愿标记答案)。 WebJobs.Publish 团队有什么地方可以跟踪这个吗?我找不到该软件包的 GitHub 存储库... 更新:在 WebJobs 的 .csproj 文件中添加 &lt;Target Name="CollectFilesFromIntermediateAssembly" /&gt; 似乎对输出部署包没有影响。 请确保在此行之后覆盖此目标 (github.com/vijayrkn/ASPNetPublishSamples/blob/master/…)。导入 webjob 目标后,需要覆盖目标。我们正在内部跟踪这个问题,因为我们没有一个 GitHub 项目来解决这个问题。一旦修复可用,将确认包的版本号。 不幸的是,即使紧跟在&lt;Import Project="..\packages\Microsoft.Web.WebJobs.Publish.1.0.13\tools\webjobs.targets" Condition="Exists('..\packages\Microsoft.Web.WebJobs.Publish.1.0.13\tools\webjobs.targets')" /&gt; 之后,它仍然包含额外的 bin 文件夹。 您能否在 WebJob 项目上运行以下命令并将输出共享给 vramak (at) Microsoft。这将有助于我们诊断问题。 msbuild /p:PublishUrl="c:\temp\Output\" /p:DeployOnBuild=true /p:Configuration=Release /p:WebPublishMethod=FileSystem /p:DeployTarget=WebPublish /v:diag(示例:github.com/vijayrkn/ASPNetPublishSamples/blob/master/…)

以上是关于Microsoft.Web.WebJobs.Publish 在部署包中产生重复的程序集的主要内容,如果未能解决你的问题,请参考以下文章