使用msbuild构建具有多个配置的单个项目时出现问题

34

问题

我们在解决方案中使用配置转换。例如:Debug、Test、Staging、Release。然而,这些配置仅用于我们的MVC项目。所有库只使用Debug和Release,这更有意义,因为我们的库只需要以调试模式或发布模式构建。

当尝试从命令行构建单个项目时,问题就出现了。我需要能够这样做,以便从TeamCity自动部署我们的构建到测试环境。

当我像这样构建单个项目时:

msbuild myproject.csproj 
/t:Build 
/P:Configuration=Test 
/P:Platform=AnyCPU 
/P:DeployOnBuild=True 
/P:DeployTarget=MSDeployPublish 
/P:MsDeployServiceUrl=https://SERVER:8172/MsDeploy.axd 
/P:AllowUntrustedCertificate=True 
/P:MSDeployPublishMethod=WMSvc 
/P:CreatePackageOnPublish=True 
/P:UserName=Username 
/P:Password=Passsword 
/P:DeployIisAppPath="IISAPPPATH"

我遇到了以下错误:
myproject.csproj" (Build target) (1) ->
"C:\src\myproject.csproj" (default target) (18) ->
  c:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(483,9)
: error : The OutputPath property is not set for project 'sampleLibrary.csproj'.  
Please check to make sure that you have specified a valid combination of
 Configuration and Platform for this project.  Configuration='Test'
  Platform='AnyCPU'.  You may be seeing this message because you are trying
 to build a project without a solution file, and have specified a
 non-default Configuration or Platform that doesn't exist for this project.
我知道这是什么意思,因为我的sampleLibrary没有一个测试配置,并且sampleLibrary的映射将包含在我的.sln文件中。
问题是:有没有一种方法可以解决这个问题,而不必为每个库项目添加这些配置?这听起来像一个丑陋的hack。

我不确定这是否能够解决你遇到的问题,但你可以从我的SO帖子在这里中获取一些有用的信息。 - David Clarke
5个回答

15

如果将开关/属性/p:OutputPath=Test设置为您是否有效?它将在名为Test的目录中输出dll文件(我想您也可以使用TeamCity变量)。

类似问题/答案的链接: https://dev59.com/KnNA5IYBdhLWcg3wH6EW#1083362

3
非常感谢。我添加了“/p:OutputPath=\bin”,然后它就可以正常工作了。 - user1325696

10

使用TFS在线时,我遇到了相同的错误,这个方法解决了我的问题。

在这里输入图片描述


1
谢谢!我也遇到了完全相同的问题。 - curious coder

7
很遗憾,您需要修改解决方案中使用的每个项目以具有相同的构建路径。
但是,如果您的项目在不考虑配置的情况下都构建到同一路径,则这是一件非常容易的事情:在项目属性的“生成”选项卡中,从“配置”下拉列表中选择“所有配置”,然后更改“输出路径”。
这将为项目文件中尚不存在的所有配置创建条目,并为所有配置设置相同的输出路径。

4

对于您所拥有的不同配置,针对版本(Release)的不同值放置一个OR条件。

例如:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' Or '$(Configuration)|$(Platform)' == 'Test|AnyCPU'">
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>

2

一个简单的解决方案是在您的项目中添加一个名为“DeploymentConfiguration”的新属性,并让它完成配置之间的映射。例如:

  <!-- this is your non-deployment DLL -->
  <!-- Default DeploymentConfiguration to 'Debug' -->
 <DeploymentConfiguration Condition="'$(DeploymentConfiguration)'==''">Debug</DeploymentConfiguartion>
 <Configuration Condition='$(DeploymentConfiguration)'=='Test'">Debug</Configuration>

然后在您的 MSBuild 调用中,传入以下内容:

 /p:DeploymentConfiguration=Test

在您的部署MVC中,您只需将DeploymentConfiguration直接指定给Configuration即可。

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