MSBuild在发布之前执行OctoPack

时间:2018-02-01 12:47:25

标签: function azure msbuild compiled octopack

我有一个C#.NET v4.6.1编译的Azure功能,我正在使用Microsoft.NET.Sdk.Functions,我使用我常用的CI / CD管道进行部署。

那就是TeamCity MSBuild构建步骤来创建OctoPack(因为我已经安装了OctoPack 3.6.3 NuGet package。 然后,我将生成的 * .nupkg 文件发布到Octopus并创建一个版本。

这就是我执行所有Azure应用服务的方式,但正如在this post中所描述的那样,已编译的Azure函数在发布时会创建一些额外的文件/文件夹来描述函数的入口点。 / p>

我可以看到(在TeamCity构建日志中)这些额外的文件/文件夹是由MSBuild(15.3.409.57025)创建的,但仅在它准备好OctoPack之后。这意味着我的OctoPack工件不包含 function.json 文件所必需的功能特定文件夹,也不包含 functionsSdk.out

我设法通过额外的TeamCity NuGet Pack构建步骤来再次构建OctoPack来解决这个问题。我还必须在项目根目录中创建一个 * .nuspec 文件,我告诉NuGet Pack包含所有内容(见下文),因为只使用 * .csproj 文件忽略了额外的文件夹/文件。

<files>
    <file src="bin\Release\net461\**\*.*" />
</files>

这是有效的,因为它在MSBuild Step之后运行,并且存在额外的文件夹/文件。它还足够强大,可以在未来添加到项目中时支持其他功能。

这个额外步骤和* .nuspec文件的需要似乎是不必要的。任何人都可以看到我出错的地方以及为什么MSBuild似乎有Publish和OctoPak的错误序列?

2 个答案:

答案 0 :(得分:0)

  1. 这可能是一个原因:
  2.   

    如果该部分存在,默认情况下OctoPack不会尝试   自动将任何额外的文件添加到您的包中,因此您需要   明确要包含哪些文件。你可以覆盖   使用/ p:OctoPackEnforceAddingFiles = true的这种行为   指示OctoPack使用它来打包文件组合   约定,以及由您的部分定义的约定。

         

    https://octopus.com/docs/packaging-applications/creating-packages/nuget-packages/using-octopack

    1. 另一个想法 - 损坏的.csproj文件。请检查一下。

      也许,在合并期间,这两行被重新排序:

      <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
      <Import Project="..\packages\OctoPack.3.6.3\build\OctoPack.targets" Condition="Exists('..\packages\OctoPack.3.6.3\build\OctoPack.targets')" />
      

      首先应该Microsoft.CSharp.targets。订单很重要。

答案 1 :(得分:0)

解决方法:发布后运行OctoPack

<Target Name="SetRunOctoPack">
    <PropertyGroup>
      <RunOctoPack>true</RunOctoPack>
    </PropertyGroup>
</Target>

<Target Name="AfterPublish" DependsOnTargets="SetRunOctoPack">
  <CallTarget Targets="OctoPack"/>
</Target>