Замена $ (SolutionDir) в Azure DevOps CI Pipeline - PullRequest
0 голосов
/ 24 апреля 2020

У меня следующая ситуация:

SQL проект, в котором у меня установлен пакет nuget. Этот пакет (просто сценарий PS) отвечает за распаковку DACPAC, необходимых для БД, с использованием ссылок на пути относительно папки решения (для поиска пакетов / и dacpacs / папок и просмотра проектов, которые он извлекает из. файл sln). Это называется событием перед сборкой.

При сборке всего решения определяется $ (SolutionDir), как и ожидалось (локально и ADO).

При сборке тестового проекта, $ (SolutionDir) является либо '', либо '* Undefined *'. Опять же, как и ожидалось, потому что msbuild не знает о решении при создании одного проекта. Я могу жить с этим предупреждением локально, без проблем.

Вопрос заключается в следующем: есть ли что-то «волшебное», что я могу использовать, чтобы сделать эту работу в Azure DevOps?

Я могу попробовать различные способы взлома, если кто-нибудь знает о таких методах, хотя я хотел бы получить чистое решение.

Пока пробовал:

1) Добавление следующей PropertyGroup:

<PropertyGroup>
  <SolutionDir Condition="'$(SolutionDir)' == '' Or '$(SolutionDir)' == '*Undefined*'">.\</SolutionDir>
</PropertyGroup>

к тестовому проекту.

2) Следующие следующие предложения: Событие предварительной сборки в Visual Studio, заменяющее $ (SolutionDir) на * Undefined *

Нет эффекта.

1 Ответ

1 голос
/ 24 апреля 2020

Если ваша структура папок выглядит примерно так:

1. * Azure Репопы Devops содержат папку решения (где существует файл xx.sln).

2. И эти проекты находятся в той же папке решения.

Вы можете попробовать мой скрипт:

  <PropertyGroup>
    <ProjectFolder>$([System.IO.Directory]::GetParent($(ProjectDir)))</ProjectFolder>
    <MySolutionDir>$([System.IO.Directory]::GetParent($(ProjectFolder)))\</MySolutionDir>
  </PropertyGroup>

$(MySolutionDir) представляет путь, в котором существуют ваши файлы sln и папки проекта. Так же, как $(SolutionDir), он также имеет \. Таким образом, его формат выглядит как SomePath\.

И рекомендуется , чтобы вставить мой сценарий выше сценария события PreBuild. Что-то вроде:

  <PropertyGroup>
    <ProjectFolder>$([System.IO.Directory]::GetParent($(ProjectDir)))</ProjectFolder>
    <MySolutionDir>$([System.IO.Directory]::GetParent($(ProjectFolder)))\</MySolutionDir>
    It's recommended to add my script and PreBuildEvent in same propertyGroup, and mine should be in the first.
    <PreBuildEvent>echo $(MySolutionDir)</PreBuildEvent> 
  </PropertyGroup>

Edit1:

Вы также можете добавить условие:

  <PropertyGroup>
    <ProjectFolder>$([System.IO.Directory]::GetParent($(ProjectDir)))</ProjectFolder>
    <MySolutionDir>$([System.IO.Directory]::GetParent($(ProjectFolder)))\</MySolutionDir>
    <SolutionDir Condition="xxxx">$(MySolutionDir)</SolutionDir>
    It's recommended to add my script and PreBuildEvent in same propertyGroup, and mine should be in the first.
    <PreBuildEvent>echo $(MySolutionDir)</PreBuildEvent> 
  </PropertyGroup>

Edit2:

Хм, теперь я могу воспроизвести проблему на моей стороне. Это довольно странное поведение, и я не уверен насчет root причины этого. Но быстрый обходной путь - это создать новый PropertyGroup для вставки нашего пользовательского скрипта вместо его вставки в существующий PropertyGroup из шаблона по умолчанию:

Раньше это было:

  ....
  <PropertyGroup>
    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">11.0</VisualStudioVersion>
    <!-- Default to the v11.0 targets path if the targets file for the current VS version is not found -->
    <SSDTExists Condition="Exists('$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\SSDT\Microsoft.Data.Tools.Schema.SqlTasks.targets')">True</SSDTExists>
    <VisualStudioVersion Condition="'$(SSDTExists)' == ''">11.0</VisualStudioVersion>
    <ProjectFolder>$([System.IO.Directory]::GetParent($'(ProjectDir)'))</ProjectFolder>
    <ParentFolder>$([System.IO.Directory]::GetParent($'(ProjectFolder)'))\</ParentFolder>
    <SolutionDir Condition=" '$(SolutionDir)' == '' Or '$(SolutionDir)' == '*Undefined*' ">$(ParentFolder)</SolutionDir>
    <PreBuildEvent>echo $(SolutionDir)</PreBuildEvent>
  </PropertyGroup>
  <Import Condition="'$(SQLDBExtensionsRefPath)' != ''" Project="$(SQLDBExtensionsRefPath)\Microsoft.Data.Tools.Schema.SqlTasks.targets" />
  <Import Condition="'$(SQLDBExtensionsRefPath)' == ''" Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\SSDT\Microsoft.Data.Tools.Schema.SqlTasks.targets" />
  <ItemGroup>
    <Folder Include="Properties" />
  </ItemGroup>
  <ItemGroup>
    <Build Include="test.sql" />
  </ItemGroup>
  <PropertyGroup>
    <PreBuildEvent>echo $(SolutionDir)</PreBuildEvent>
  </PropertyGroup>
</Project>

Сейчас измените его на:

  <PropertyGroup>
    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">11.0</VisualStudioVersion>
    <!-- Default to the v11.0 targets path if the targets file for the current VS version is not found -->
    <SSDTExists Condition="Exists('$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\SSDT\Microsoft.Data.Tools.Schema.SqlTasks.targets')">True</SSDTExists>
    <VisualStudioVersion Condition="'$(SSDTExists)' == ''">11.0</VisualStudioVersion>
  </PropertyGroup>
  <Import Condition="'$(SQLDBExtensionsRefPath)' != ''" Project="$(SQLDBExtensionsRefPath)\Microsoft.Data.Tools.Schema.SqlTasks.targets" />
  <Import Condition="'$(SQLDBExtensionsRefPath)' == ''" Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\SSDT\Microsoft.Data.Tools.Schema.SqlTasks.targets" />
  <ItemGroup>
    <Folder Include="Properties" />
  </ItemGroup>
  <ItemGroup>
    <Build Include="test.sql" />
  </ItemGroup>
  <PropertyGroup>
    <ProjectFolder>$([System.IO.Directory]::GetParent($(ProjectDir)))</ProjectFolder>
    <ParentFolder>$([System.IO.Directory]::GetParent($(ProjectFolder)))\</ParentFolder>
    <SolutionDir Condition=" '$(SolutionDir)' == '' Or '$(SolutionDir)' == '*Undefined*' ">$(ParentFolder)</SolutionDir>
    <PreBuildEvent>echo $(SolutionDir)</PreBuildEvent>
  </PropertyGroup>

Также удалите лишние ' в $(ProjectDir). Это должно быть $(ProjectDir) вместо $'(ProjectDir)' и $'(ProjectFolder)'. Я также вижу, что у вас есть два свойства PreBuildEvent, просто оставьте одно в нашем собственном скрипте. После вышеуказанных шагов ваш проект теперь хорошо работает на моей стороне:

enter image description here

...