Создайте группу проектов с подпунктами подстановки из .sln в массовом порядке в их соответствующие выходные каталоги - PullRequest
0 голосов
/ 18 июня 2019

У нас есть решение, созданное и поддерживаемое с помощью VisualStudio2017, в котором наши .csprojs размещены внутри виртуальных папок примерно так:

Solution.sln
  \- VirtualFolder1
       \- Foo.Common.Bar.csproj -> Bar\bin
       \- Foo.Common.Ping.csproj -> Ping\bin
       \- Foo.Common.Pong.csproj -> Pong\bin
  \- VirtualFolder2
       \- Foo.Utils.Bar.csproj -> Utils.Bar\bin
       \- Foo.Utils.Ping.csproj -> Utils.Ping\bin
       \- Foo.Utils.Pong.csproj -> Utils.Pong\bin

Как и ожидалось, каждыйи каждый файл .csproj уже содержит раздел, который определяет, где должен быть выходной путь:

  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <PlatformTarget>AnyCPU</PlatformTarget>
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>[Bar/bin or Ping/bin etc]</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <LangVersion>7.1</LangVersion>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <PlatformTarget>AnyCPU</PlatformTarget>
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>[Bar/bin or Ping/bin etc]</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <LangVersion>7.1</LangVersion>
  </PropertyGroup>

Мы хотим собрать все .Common .csproj и .Utils .csproj проецирует массово в соответствующие папки вывода без необходимости указывать их в нашем msbuild-скрипте (который вызывается JenkinsCI, кстати) по очереди.Чтобы добиться этого, мы попытались:

<ItemGroup>      
  <ALL_PROJECTS_IN_SOLUTION_EXCEPT_TESTS
    Include="$(_codeFolderpath)\**\*.csproj"
  />
</ItemGroup>

<MSBuild
  Projects="@(ALL_PROJECTS_IN_SOLUTION_EXCEPT_TESTS)"
  Properties="Platform=$(Platform);Configuration=$(Configuration)"
  BuildInParallel="true"
/>

Это, однако, приводит к следующим ошибкам для всех наших .csproj:

The OutputPath property is not set for project [...].csproj

Это странно, учитывая тот факт, что OutputPath определен внаши файлы .csproj (как показано выше).

Если мы укажем свойство «Выход», тогда проблема, конечно, исчезнет, ​​однако мы действительно хотим, чтобы эти проекты выводили себя в соответствующие соответствующие выходные каталоги (показано на рисунке).выше).Как можно добиться этого?

1 Ответ

1 голос
/ 19 июня 2019

Похоже, у вас есть один отдельный проект (Build Project), используемый для сборки проектов .Common .csproj и .Utils .csproj. И сценарий, который вы пишете выше, определен в качестве цели в Build Project. (Надеюсь, я не понял неправильно.)

В соответствии с вашим сообщением об ошибке The OutputPath property is not set... Не определено свойство OutputPath в Common. .csproj или Utils. .csproj.

Если это так, я предлагаю вам использовать такую ​​структуру папок:

Solution.sln
  \- VirtualFolder1
       \- Foo.Common.Bar.csproj -> Foo.Common.Bar\bin
       \- Foo.Common.Ping.csproj -> Foo.Common.Ping\bin
       \- Foo.Common.Pong.csproj -> Foo.Common.Pong\bin
  \- VirtualFolder2
       \- Foo.Utils.Bar.csproj -> Foo.Utils.Bar\bin
       \- Foo.Utils.Ping.csproj -> Foo.Utils.Ping\bin
       \- Foo.Utils.Pong.csproj -> Foo.Utils.Pong\bin

Потому что, чтобы получить ту же структуру, какую вы хотите, я думаю, может быть, там гораздо более сложная работа: 1.Без выхода OutputPath в файле .csproj мы можем создать файл Directory.Build.props в каталоге выше его пути для управления путем вывода.

2.Пропустите свойство OutputPath в вашей задаче MSBuild. В этой ситуации вам нужно получить второе имя для проектов .common.csproj и .utils.csproj и добавить такие условия, как:

<MSBuild
      Projects="@(ALL_PROJECTS_IN_SOLUTION_EXCEPT_TESTS)"
      Properties="Platform=$(Platform);Configuration=$(Configuration);OutputPath=xxx\ThirdName\bin"
      BuildInParallel="true"
      Condition="judge if the common.csproj files"
    />
    <MSBuild
      Projects="@(ALL_PROJECTS_IN_SOLUTION_EXCEPT_TESTS)" 
      Properties="Platform=$(Platform);Configuration=$(Configuration);OutputPath=xxx\SecondName.ThirdName\bin"
      BuildInParallel="true"
      Condition="judge if the utils.csproj files"
    />

Так что оба эти двух направления могут помочь в достижении вашей конкретной цели, но работа будет намного больше, чем мы ожидаем.

В качестве обходного пути: Почему вы должны поместить их в папку Utils.Bar\bin вместо папки Foo.Utils.Bar\bin? Последнее является предопределенным свойством для файла Foo.Utils.Bar.csproj. Итак, мы можем легко использовать $ (ProjectDir) или $ (ProjectName) для его представления. Вы можете создать файл Directory.Build.props, добавив следующий скрипт:

<Project>
 <PropertyGroup>
  <OutputPath>$(ProjectDir)bin\$(Configuration)</OutputPath>
</PropertyGroup>
</Project>

Таким образом, при загрузке файлов проекта в VS вам нужно сделать build the solution. Вам больше не нужно будет строить проект Build. И поскольку вы используете виртуальный путь, который я не пробовал, возможно, вы можете использовать <OutputPath>AbsolutePathOfMyOutput\$(ProjectName)bin\$(Configuration)</OutputPath>

Обновление: (Вы не заметили ваши изменения до сегодняшнего дня.)

В соответствии с вашими правками вы установили выходной путь в .csproj.

Вот два предложения:

1.Если вы создаете их в VS ID: каждый раз после внесения каких-либо изменений в xx.csproj вне VS IDE с помощью блокнота или чего-либо другого, я предлагаю вам щелкнуть правой кнопкой мыши по проекту на unload and reload the project file, прежде чем создавать их

2.Пожалуйста, проверьте, выглядит ли все полученное сообщение об ошибке следующим образом:

error : The OutputPath property is not set for project 'ConsoleApp1.csproj'.  Please check to make sure that
 you have specified a valid combination of Configuration and Platform for this project.  Configuration=''  Platform='An
yCPU'.

Поскольку ваши OutputPath property определены в PropertyGroup для Debug|AnyCPU и Release|AnyCPU. Если вы не передали соответствующие параметры в msbuild.exe, процесс не может прочитать свойство OutPutPath из этих групп ProppertyGroups.

Например: вы определяете OutPutPath в Debug|AnyCPU и Release|AnyCPU. Тогда реальное значение Configuration and Platform, которое вы передаете, равно Debug|X86, or Null|AnyCPU or CustomDebug|AnyCPU, и вы не определили OutPutPath в этом виде комбинации (PropertyGroup), вы получите сообщение об ошибке xxx not set.

Чтобы решить эту проблему: Убедитесь, что вы передали правильную комбинацию конфигурации и платформы, чтобы решить эту проблему. Или определите OutPutPath в фактически используемой вами комбинации.

...