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

时间:2016-05-06 19:07:43

标签: msbuild continuous-integration azure-service-fabric continuous-delivery

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

msbuild SFApp.sfproj /t:Package

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

msbuild SFSolution.sln /t:Package

失败,因为目标不存在。

随着我们的依赖关系网格的增长,它达到了大多数接口项目在没有解决方案文件(to work around the "OutputPath does not exist" red herring)的情况下无法构建的程度。似乎有办法做到这一点according to this answer。不幸的是,像 Clean 这样的目标工作......

msbuild SFSolution.sln /t:SFApplication:Clean
(…snip…)
Build succeeded.
    0 Warning(s)
    0 Error(s)

......目标套餐赢了!

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)

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

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

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

5 个答案:

答案 0 :(得分:4)

在没有sln的情况下编译sfproj文件(和任何其他项目文件)是个坏主意,因为它可能会从引用项目的输出中带来错误的内容。只有解决方案才能了解要在什么配置中编译的项目。

使包类似于"右键单击>包"在VS中: 只需在您的sfproj中添加以下目标

即可
  <Target Name="ForcePackageTarget" AfterTargets="Build" Condition="'$(ForcePackageTarget)' =='true'">
    <CallTarget Targets="Package"/>
  </Target>

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

msbuild yoursolution.sln /t:Build /p:ForcePackageTarget=true /p:Configuration=Release /p:Platform=x64

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

我遇到了同样的问题并通过更改失败项目中的平台来明确构建x64来修复它。

点击Build&gt; Configuration Manager并确保为x64平台编译程序集,该程序集还应在相应的.csproj文件中设置输出路径。enter image description here

正在执行的实际命令行操作是:

"C:\Program Files (x86)\MSBuild\14.0\bin\amd64\msbuild.exe" "C:\agent\_work\1\s\Project\SFProject.sfproj" /t:Package /p:platform="x64" /p:configuration="release" /p:VisualStudioVersion="14.0"

答案 3 :(得分:0)

使用以下脚本。

C:\ Program Files(x86)\ Microsoft Visual Studio 14.0&gt; msbuild“Fabric.sfproj”/ t:Package / p:Configuration = Release

服务结构要求在x64平台中设置Target, 因此,将所有引用项目目标更改为x64平台。

您可以使用解决方案的配置属性来执行此操作。如果“配置属性”中未列出x64,请在同一窗口中单击配置管理器,并在所需项目的平台列下将新项目平台添加为x64。

希望这适合你。

答案 4 :(得分:-1)

我们遇到了与您完全相同的问题,我一直在寻找解决方案,并在整个网络上进行了一些实验。这些是对我们有用的步骤:

  1. 不要按照StackOverflow上其他答案的建议手动添加目标。不必要。特别是在CI环境中,您希望分别构建项目。
  2. 在解决方案中准备项目:将所有项目的目标平台更改为x64
  3. 构建应用程序
  4. msbuild.exe SFAplication.xproj /p:Configuration=Release /target:rebuild

    1. 打包应用
    2. msbuild.exe SFAplication.sfproj /p:Configuration=Release /target:Package