Проблема Создание единого проекта с использованием msbuild с несколькими конфигурациями
Вопрос
Мы используем конфигурационные преобразования внутри нашего решения. Например: 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 файле
Вопрос
Есть ли способ решить эту проблему, не добавляя эти конфигурации для каждого проекта библиотеки? Здесь пахнет уродливым взломом.
Ответы
Ответ 1
К сожалению, вам придется изменить каждый проект, который используется в решении, для того же пути сборки.
Однако это довольно легко сделать, если ваши проекты все построены на один и тот же путь, независимо от конфигурации: на вкладке Build
свойств проекта выберите All Configurations
из раскрывающегося списка Configuration
, а затем измените Output path
.
Это создаст записи для всех конфигураций в файле проекта, которые еще не существуют, и установите одинаковый путь вывода для всех конфигураций.
Ответ 2
Будет ли настройка switch/property /p:OutputPath=Test
работать на вас? Он выведет DLL в каталог Test (я бы вам также мог использовать переменные TeamCity).
Ссылка на аналогичный вопрос/ответ
fooobar.com/questions/225176/...
Ответ 3
Используя TFS онлайн я получил ту же ошибку, это исправило мою проблему
![enter image description here]()
Ответ 4
Одним из простых решений было бы добавить новое свойство в ваши проекты под названием "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 через конфигурацию напрямую.
Ответ 5
Поместите условие OR для разных значений в Release для множества различных конфигураций, которые у вас есть.
например.
<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>