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

Msbuild 命令行包服务结构应用程序,msbuild,continuous-integration,azure-service-fabric,continuous-delivery,Msbuild,Continuous Integration,Azure Service Fabric,Continuous Delivery,直到最近,我们的持续交付设置使用以下命令交付服务结构包: msbuild SFApp.sfproj /t:Package 这是必要的,因为目标包在解决方案级别不可用。即命令 msbuild SFSolution.sln /t:Package 失败,因为目标不存在 随着依赖关系网格的增长,大多数接口项目在没有解决方案文件()的情况下无法构建。似乎有办法做到这一点。不幸的是,虽然目标像清洁工作 …目标软件包不会 msbuild SFSolution.sln /t:SFApplication:Pa

直到最近,我们的持续交付设置使用以下命令交付服务结构包:

msbuild SFApp.sfproj /t:Package
这是必要的,因为目标包在解决方案级别不可用。即命令

msbuild SFSolution.sln /t:Package
失败,因为目标不存在

随着依赖关系网格的增长,大多数接口项目在没有解决方案文件()的情况下无法构建。似乎有办法做到这一点。不幸的是,虽然目标像清洁工作

…目标软件包不会

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应用程序?

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

我遇到了同样的问题,并通过将失败项目中的平台更改为显式为
x64
生成来修复它

单击
Build
Configuration Manager
,确保为x64平台编译了程序集,这也应该在相应的.csproj文件中设置输出路径

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

“C:\ProgramFiles(x86)\MSBuild\14.0\bin\amd64\MSBuild.exe”“C:\agent\\u work\1\s\Project\SFProject.sfproj”/t:Package/p:platform=“x64”/p:configuration=“release”/p:VisualStudioVersion=“14.0”

我们遇到了与您完全相同的问题,我一直在网上寻找解决方案,并做了一些实验。以下是对我们有效的步骤:

  • 不要像StackOverflow上其他答案所建议的那样在任何地方手动添加目标。没有必要。尤其是在CI环境中,您希望以任何方式分别构建项目
  • 准备解决方案中的项目:将所有项目的目标平台更改为x64
  • 构建应用程序
  • msbuild.exe SFAplication.xproj/p:Configuration=Release/target:rebuild

  • 打包应用程序
  • msbuild.exe SFAplication.sfproj/p:Configuration=Release/target:Package

    使用以下脚本

    C:\ProgramFiles(x86)\Microsoft Visual Studio 14.0>msbuild“Fabric.sfproj”/t:Package/p:Configuration=Release

    服务结构要求在x64平台中设置目标, 所以,将所有参考项目目标更改为x64平台

    您可以通过使用解决方案的配置属性来实现这一点。如果“配置属性”中未列出x64,请在同一窗口和所需项目的“平台”列下单击“配置管理器”,将新项目平台添加为x64


    希望这对您有用。

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

    要使软件包类似于VS中的“右键单击->软件包”,请执行以下操作: 只需在sfproj中添加以下目标

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

    实际上,对于所有不起作用的引用项目的解决方案配置,它执行“构建”和“打包”两步合一。如果我一个接一个地运行,则没有变化。请参阅第[1]行生成CLI[296]程序包CLI[542]第一个输出路径错误[629]最后一个错误根据生成输出,您的解决方案配置配置为使用AnyCPU。.sfproj及其引用的项目配置为使用x64。您需要适当地更新解决方案配置。您是否尝试过创建新的Service Fabric应用程序项目,并尝试以相同的方式从命令行构建它?如果该测试项目能够工作,那么我们至少应该考虑一下您的项目中的配置问题。很难说构建输出粘贴的问题是什么。您能在启用诊断详细性的情况下提供生成输出吗?由于工作变动,这个问题与我不再相关,我可能永远无法接受答案。即使有人花时间提出正确的解决方案,我也无法验证它的正确性。不过,我要补充一点,问题最终是通过迁移到VST解决的。我们从来没有想到如何将MSBuild用于这一目的。这就是为我所做的。此外,关于解决方案文件实际做什么的原因(都是关于配置集的,它基本上是根据哪种配置来设置项目的),我们只花了一分钱。非常感谢。
      <Target Name="ForcePackageTarget" AfterTargets="Build" Condition="'$(ForcePackageTarget)' =='true'">
        <CallTarget Targets="Package"/>
      </Target>
    
    msbuild yoursolution.sln /t:Build /p:ForcePackageTarget=true /p:Configuration=Release /p:Platform=x64