命令行包服务结构应用程序

Eke*_*voo 8 msbuild continuous-integration continuous-delivery azure-service-fabric

直到最近,我们的持续交付设置是使用以下命令提供Service Fabric软件包:

msbuild SFApp.sfproj /t:Package
Run Code Online (Sandbox Code Playgroud)

这是必要的,因为目标在解决方案级别不可用.即命令

msbuild SFSolution.sln /t:Package
Run Code Online (Sandbox Code Playgroud)

失败,因为目标不存在.

随着我们的依赖关系网格的增长,如果没有解决方案文件,大多数接口项目将无法构建(解决"OutputPath不存在"的问题).根据这个答案,似乎有办法做到这一点.不幸的是,虽然目标像清洁工作......

msbuild SFSolution.sln /t:SFApplication:Clean
(…snip…)
Build succeeded.
    0 Warning(s)
    0 Error(s)
Run Code Online (Sandbox Code Playgroud)

......目标套餐不会!

msbuild SFSolution.sln /t:SFApplication:Package
(…snip…)
Build FAILED.
"SFSolution.sln" (SFApplication:Package target) (1) -> SFSolution.sln.metaproj :
        error MSB4057: The target "SFApplication:Package" does not exist in the
        project. [SFSolution.sln]
    0 Warning(s)
    1 Error(s)
Run Code Online (Sandbox Code Playgroud)

(为清楚起见,解决方案/项目文件夹/名称省略/更改.如有必要,我可以提供实际日志.)

所以问题是:我怎样才能使用命令行,使用Package目标和解决方案文件构建一个项目?

或者我如何从命令行打包Service Fabric应用程序?

Evg*_*tov 6

不使用sln编译sfproj文件(和任何其他项目文件)是个坏主意,因为它可能给引用项目带来错误的内容。只有解决方案才知道要在哪种配置中编译哪个项目。

在VS中使Package类似于“ Right Click-> Package”:只需将以下目标添加到sfproj中

  <Target Name="ForcePackageTarget" AfterTargets="Build" Condition="'$(ForcePackageTarget)' =='true'">
    <CallTarget Targets="Package"/>
  </Target>
Run Code Online (Sandbox Code Playgroud)

然后运行正常的构建解决方案,您可以通过/ p:ForcePackageTarget = true触发软件包步骤:

msbuild yoursolution.sln /t:Build /p:ForcePackageTarget=true /p:Configuration=Release /p:Platform=x64
Run Code Online (Sandbox Code Playgroud)

实际上,它针对所有引用的项目执行“解决方案配置”的二合一步骤:构建和打包

  • 这就是为我做的。此外,关于解决方案文件实际执行的原因/用途(所有关于配置集,它本质上是根据哪个配置设置项目),我们只花了一分钱。谢谢你! (2认同)

Mat*_*man 1

MSBuild 仅支持可在解决方案级别指定的一小组目标名称。正如您所发现的,Package 不是其中之一。您需要对 MSBuild 执行两次单独的调用:一次构建解决方案,另一次调用 sfproj 上的 Package 目标。sfproj 的 Package 目标依赖于 Build 目标,因此它将确保构建 sfproj 及其项目依赖项。

  • 根据构建输出,您的解决方案配置已配置为使用 AnyCPU。.sfproj 及其引用的项目配置为使用 x64。您需要适当更新解决方案配置。 (3认同)