从解决方案文件中构建项目的MSBuild

5
我正在尝试使用MSBuild从RTC(BuildForge)启动.NET构建。我不断收到以下异常:

错误 MSB1009:项目文件不存在。开关: F:\Program Files (x86)\IBM\Build Forge\Agent\Captiva_Build_dotNET\BUILD_117\xxxxxx\Source Code\Components\xxxxxx\xxxxxxx.sln


构建命令如下:
MSBuild.exe "xxxx.sln" /t:xxx_yyyy_zzzzzz_asdfasdf_base

/t: 是解决方案中的一个项目之一。我不明白自己做错了什么。我的语句中有_。这应该是一个简单的构建过程?有什么想法吗?


关于您下面的回复,您能否发布相关的目标节点,从您的输出.metaproj中确认您发送的目标是否与输出metaproj中显示的完全相同? - Nicodemeus
实际上,这正是我所做的。我有一个PowerShell脚本来创建该日志行,现在正在尝试以此方式构建它。虽然我可以构建vb项目,但这听起来并不是最佳实践。 - SoftwareSavant
1个回答

14

使用msbuild.exe /t:目标 命令可以在解决方案或项目中执行特定的目标。

msbuild.exe MySolution.sln /t:Clean

为了构建特定的项目,您需要指定项目文件而不是解决方案。
msbuild.exe MyProject.csproj

编辑:

太棒了,你说得对。我使用MsBuildEmitSolution 环境变量输出了元项目脚本,但以前从未见过。

在你到达这一步之前,

MsBuild.exe MySolution.sln /t:ProjectName:TargetName

在命令行中,设置MsBuildEmitSolution:
set MsBuildEmitSolution=1

然后生成你的元项目。
MsBuild.exe MySolution.sln /pp

在记事本中打开输出文件MySolution.sln.metaproj,向下滚动并找到要构建的相关<Target />节点,并注意其中的Name属性字符串。

  <Target Name="Client_Test:Build">
    <MSBuild Condition="'%(ProjectReference.Identity)' == '...Client_Test.csproj'" Projects="@(ProjectReference)" Targets="Publish" BuildInParallel="True" ToolsVersion="$(ProjectToolsVersion)" Properties="..." />
  </Target>

然后,就完成了!

MsBuild.exe MySolution.sln /t:"Client_Test:Build"

1
不,我认为你可以从解决方案中构建一个项目... 我只是想知道我是否有正确的语法... 如果我没记错的话,我以前能做到这一点,但不知何故它说该项目不存在? 我确定它存在。 - SoftwareSavant
同时...http://msdn.microsoft.com/zh-cn/library/ms171486.aspx 展示了如何实现它... - SoftwareSavant
你说得没错,但你知道我为什么会收到上面的异常吗?就像我所说的,这基本上是我正在进行的调用。 - SoftwareSavant
因为您跳过了生成输出“solution.sln.metaproj”文件并使用目标节点中显示的名称的步骤。请查看夹在VOILA之间的代码块,并查看目标名称如何被传递,就像在.metaproj中一样。 - Nicodemeus
@Nicodemeus:这也解决了我的问题。就像OP一样,我发现这个错误在我使用VS2015时出现,而之前没有出现过。所以这是因为使用VS2015与旧版本创建项目的默认方式不同吗?导致元项目文件未被创建。 - Chintan Pathak
此外,有没有办法避免将来需要这样做?即是否有一种可以调整的VS设置,以便从此时开始创建的项目包含元项目文件。 - Chintan Pathak

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