命令行包服务织布应用程序

10

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

msbuild SFApp.sfproj /t:Package

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

由于目标不存在,因此失败。

随着我们的依赖网格越来越大,大多数接口项目都需要解决方案文件才能构建(以解决“OutputPath不存在”问题)。根据这个答案似乎有一种方法可以做到这一点。不幸的是,像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)

问题是:如何使用命令行构建一个项目,使用Package目标和解决方案文件?或者如何通过命令行打包Service Fabric应用程序?(为了清晰起见,省略了解决方案/项目文件夹/名称。如有必要,我可以提供实际日志。)

由于工作变动,这个问题对我已经不再相关,我可能永远也无法接受一个答案。即使有人花时间提供了正确的解决方案,我也无法验证其正确性。 - Liz Av
我想补充的是,最终我们通过迁移到VSTS来解决了这个问题。我们从未弄清如何使用MSBuild来实现这一目的。 - Liz Av
5个回答

13

不使用sln文件编译sfproj文件(或任何其他项目文件)是个坏主意,因为它可能会将来自所引用项目的错误内容带入输出。只有solution知道以什么配置编译哪个项目。

要使Package类似于VS中的“右键单击->Package”: 只需将以下目标添加到您的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

实际上,它可以执行两个步骤:构建和打包,针对所有引用的项目的解决方案配置。


2
这就是解决我的问题的方法。此外,我突然明白了解决方案文件实际上是做什么的(关于配置集合的一切,它根据任何配置设置项目)。谢谢! - Jaans

1
请使用下面的脚本。
C:\ Program Files(x86)\ Microsoft Visual Studio 14.0> msbuild“Fabric.sfproj”/t:Package /p:Configuration = Release 服务织物要求在x64平台上设置目标, 因此将所有引用项目的目标更改为x64平台。 您可以通过使用解决方案的配置属性来执行此操作。如果“配置属性”中未列出x64,请单击同一窗口中的“配置管理器”,并在所需项目的平台列下添加新的项目平台作为x64。
希望这对您有帮助。

1

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


那不起作用。如果我一个接一个地运行它们,就不会有任何变化。请参见http://pastebin.com/uMjdSJ1Q,行:[1]构建CLI [296]打包CLI [542]第一个OutputPath错误[629]最后一个错误。 - Liz Av
3
根据构建输出,您的解决方案配置已配置为使用 AnyCPU。.sfproj 及其引用的项目已配置为使用 x64。您需要适当更新解决方案配置。 - Matt Thalman
你尝试过创建一个新的Service Fabric应用程序项目,并尝试以相同的方式从命令行构建它吗?如果测试项目可以工作,那么至少现在我们知道这是你项目中的配置问题。从构建输出粘贴中很难说出问题可能是什么。你能提供打开诊断详细程度的构建输出吗? - Matt Thalman

1

我曾经遇到过同样的问题,通过将失败的项目中的平台更改为显式构建x64来解决了这个问题。

点击生成 > 配置管理器,确保程序集是为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"


-1

我们曾经遇到了和你一样的问题,我在网上寻找解决方案并进行了一些实验。以下是对我们有效的步骤:

  1. 不要像StackOverflow上其他答案建议的那样手动添加目标。这不是必要的。特别是在CI环境中,您需要单独构建项目。
  2. 准备解决方案中的项目:将所有项目的目标平台更改为x64
  3. 构建应用程序

msbuild.exe SFAplication.xproj /p:Configuration=Release /target:rebuild

  1. 打包应用程序

msbuild.exe SFAplication.sfproj /p:Configuration=Release /target:Package


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接