2

我有一个 C# .NET v4.6.1 编译的 Azure 函数,我正在使用Microsoft.NET.Sdk.Functions并使用我常用的 CI/CD 管道部署它。

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

这就是我执行所有 Azure 应用程序服务的方式,但是正如这篇文章中很好地描述的那样,编译的 Azure Functions 在发布时会创建一些额外的文件/文件夹来描述函数的入口点。

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

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

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

这是因为它在 MSBuild 步骤之后运行并且存在额外的文件夹/文件。当被添加到未来的项目中时,它也将足够强大以支持其他功能。

这个额外的步骤和 *.nuspec 文件似乎没有必要。谁能看到我哪里出错了,为什么 MSBuild 似乎有 Publish 和 OctoPak 的顺序错误?

4

2 回答 2

0

解决方法:发布后运行 OctoPack

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

<Target Name="AfterPublish" DependsOnTargets="SetRunOctoPack">
  <CallTarget Targets="OctoPack"/>
</Target>
于 2018-12-18T20:25:20.293 回答
0
  1. 这可能是一个原因:

如果该部分存在,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第一个。订单很重要。

于 2018-02-05T20:14:05.777 回答