Дубликат ссылки на проект в решении базы данных SSDT - PullRequest
0 голосов
/ 05 апреля 2019

Я использую tSQLt в решении, содержащем несколько проектов базы данных SQL Server. Для каждого проекта есть проект .Test, который ссылается на исходный и источник tSQLt.

Вот краткий план решения:

Решение

  • Проект DB1
  • Проект DB1.Test
  • Проект DB2
  • Проект DB2.Test
  • Проект TSQLT

Где

  • Проект DB2 зависит от проекта DB1
  • Проект DB1.Test зависит от DB1 и TSQLT (используется опция «Та же база данных»)
  • Проект DB2.Test зависит от DB2 и TSQLT (с использованием опции «Та же база данных») и от DB1.Test (тот же сервер, другая база данных с переменной). поскольку DB1.Test зависит от DB1 и TSQLT, этот проект также зависит от них (используется та же переменная, что и для DB1.Test).

Проблема в том, что ссылка на DB1.Test не возвращает объекты TSQLT и DB1, когда на нее ссылаются из DB2.Test, поэтому я получаю огромный список предупреждений о неразрешенных ссылках. Предупреждения, связанные с DB1, могут быть устранены путем ссылки на этот проект с использованием той же переменной, что и DB1.Test, но здесь уже упоминается TSQLT, и когда я пытаюсь сослаться на него дважды, это приводит к ошибке «дублирующаяся ссылка».

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

Другой вариант - построить этот проект с использованием разных конфигураций и просто ссылаться на файлы .dacpac, но это похоже на взлом.

Мы теоретически могли бы вывести проект TSQLT за пределы решения и иметь несколько копий файла dacpac и ссылаться на них, однако я стараюсь хранить все в одном месте.

В настоящее время у нас нет репозиториев NuGet, поэтому распространение кода с использованием пакетов NuGet для поддержания этой части в актуальном состоянии также не работает.

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

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

Есть ли какое-либо решение для переноса ссылок, когда есть вложенные ссылки?

Или сохранить локальную копию файла dacpac, сгенерированного во время сборки, под пользовательским (уникальным) именем при копировании из одного проекта в другой во время сборки?

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

Мне известна опция «подавлять предупреждения», но я бы хотел, чтобы они были отключены. (Это не заставит объект волшебным образом появляться в IntelliSense).

Включение или отключение параметра «Локальное копирование» в этом случае не влияет на поведение.

1 Ответ

0 голосов
/ 05 апреля 2019

Я нашел решение, которое все еще немного пахнет как хак, но работает правильно.

Событие сборки

Добавление события после сборки кобщий проект:

  1. Щелкните правой кнопкой мыши общий проект (в данном случае TSQLT)
  2. Выберите Properties...
  3. Перейдите на вкладку Build Events
  4. Нажмите Edit Post-build...
  5. Скопируйте следующий код в окно редактора
  6. Измените его в соответствии со своими потребностями
  7. Сохраните все, когда закончите (это сохранитфайлы проекта и решения)

    copy "$ (ProjectName) .dacpac" "$ (ProjectName) _DB1.dacpac" / Y copy "$ (ProjectName) .dacpac" "$ (ProjectName) _DB2.dacpac"/ Y

Это создаст копии файла TSQLT.dacpac в выходной папке (будут созданы файлы TSQLT_DB1.dacpac и TSQLT_DB2.dacpac).

Убедитесь, что, что путь сборки для файла dacpac использует переменную $(ProjectName), или используйте жестко заданное имя и измените событие сборки соответствующим образом.

Ссылка на базу данных

Ссылка на эти файлы в качестве приложения уровня данных в проектах.

Если у вас несколько конфигураций сборки, откройте файл .sqlproj и отредактируйте его, чтобы иметь динамический путь сборки:

<ArtifactReference Include="..\.build\$(Configuration)\TSQLT\TSQLT_DB1.dacpac">
  <HintPath>..\.build\$(Configuration)\TSQLT\TSQLT_DB1.dacpac</HintPath>
  <SuppressMissingDependenciesErrors>False</SuppressMissingDependenciesErrors>
  <DatabaseSqlCmdVariable>DB1</DatabaseSqlCmdVariable>
  <Private>False</Private>
</ArtifactReference>
<ArtifactReference Include="..\.build\$(Configuration)\TSQLT\TSQLT_DB2.dacpac">
  <HintPath>..\.build\$(Configuration)\TSQLT\TSQLT_DB2.dacpac</HintPath>
  <SuppressMissingDependenciesErrors>False</SuppressMissingDependenciesErrors>
  <DatabaseSqlCmdVariable>DB2</DatabaseSqlCmdVariable>
  <Private>False</Private>
</ArtifactReference>

Обратите внимание на $(Configuration) на пути.Этот метод предполагает, что имя конфигурации сборки одинаково для всех проектов.(По сути, нам нужно то же самое, что и в пути сборки (

Теперь вы можете удалить исходную ссылку на проект.

Зависимость сборки

Удаляя ссылку на проект, Visual Studio также удаляет зависимость сборки.

  1. Щелкните правой кнопкой мыши решение
  2. Выберите properties...
  3. Перейдите к Common Properties/ Project Dependencies
  4. Выберите проект из выпадающего списка
  5. Установите флажок перед ссылочным проектом

Это обеспечивает построение текущего проекта.вызовет сборку указанного объекта (и он запустит событие после сборки).

Примечания

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

Я не изменил ссылку на другие проекты, так как у меня нет такой проблемы с ними.

...