Ссылки на файлы подмодулей в скрипте SSDT перед развертыванием или после развертывания, вызывающие ошибку 72001

В проекте SQL Server Data Tools (SSDT) ​​в Visual Studio у нас есть «базовый» набор объектов SQL, которые включены в каждый проект SQL, который мы делаем, — что-то вроде библиотеки классов. Мы храним эти «основные» объекты SQL в отдельном репозитории Git, а затем включаем их в другие проекты как подмодуль Git.

Как только «основной» подмодуль связан с основным проектом, мы включаем файлы подмодуля в наш файл .SQLPROJ следующим образом:

<Content Include="..\CoreSubmodule\ProjectFolder\Scripts\**\*.*"> <Link>Scripts\%(RecursiveDir)%(FileName)%(Extension)</Link> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content>

Это отлично работает для обычных файлов .sql в проекте - они отображаются со специальным значком в Visual Studio, указывающим, что это файл, на который ссылаются, и механизм сборки может прекрасно разрешать ссылки/зависимости. Однако мы сталкиваемся с проблемой с нашими сценариями до и после развертывания.

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

/Scripts/ /PostDeploy/ _PostDeployMaster.sql /ReferenceData/ ReferenceDataScript1.sql

В приведенной выше структуре:

  • _PostDeploymentMaster.sql — это локальный файл в проекте, для которого задано значение Build Action = "PostDeploy". Он содержит ссылку на файл *ReferenceDataScript1.sql.
  • ReferenceDataScript1.sql is a reference to a file that physically exists in the submodule directory (one level up from our project), and is set to Build Action = "None"
    • Note that Visual Studio displays it in the /ReferenceData/ folder as a linked file

Скрипт _PostDeploymentMaster ссылается на другие субскрипты через ссылку SQLCMD:

:r .\ReferenceData\ReferenceDataScript1.sql go

Попытка построить проект таким образом приводит к ошибке SQL72001 в Visual Studio ("Включенный файл не существует"). Очевидно, что если мы физически поместим файл ReferenceDataScript1.sql в каталог (без ссылки), он будет прекрасно построен.

Варианты, которые мы исследовали, включают в себя наличие «буферного» сценария без сборки между мастером PostDeploy и базовыми индексами (та же ошибка), а также наличие действий до и после сборки, настроенных на физическое копирование файлов туда и обратно из подмодуля в проект, чтобы удовлетворить движок сборки (слишком хакерский на наш вкус).

Кто-нибудь сталкивался с этой проблемой или у него есть исправный обходной путь?


person Jeff Lewis    schedule 15.08.2018    source источник
comment
Работает ли использование ..\..\ etc \ReferenceData? Предполагая, что он у вас есть в папке более высокого уровня, надеюсь, в соответствии со всеми вашими репозиториями.   -  person Peter Schott    schedule 15.08.2018
comment
Можете ли вы установить действие сборки для копирования?   -  person user1443098    schedule 15.08.2018
comment
@PeterSchott - этот метод позволит нам построить, но, к сожалению, он не скопирует сценарии в нужное место для нашего развертывания DACPAC.   -  person Jeff Lewis    schedule 15.08.2018
comment
@user1443098 user1443098 - это параметры, которые мы получаем для действия сборки: сборка, конфигурация расширения сборки, компиляция, конфигурация расширения развертывания, нет, после развертывания, до развертывания, RefactorLog. Для параметра CopyToOutputDirectory установлено значение «Всегда копировать».   -  person Jeff Lewis    schedule 15.08.2018
comment
Я думал, что сценарии до/после развертывания встроены в сам dacpac. Правда, давно не заглядывал. Единственное, что я могу придумать помимо этого, это какой-то процесс предварительной сборки, который делает это копирование для вас. Либо так, либо вы используете составные проекты, поэтому вы включаете этот проект/dacpac в каждый проект, который вы развертываете, и сталкиваете их все вместе или сначала сталкиваете общий, а затем основной.   -  person Peter Schott    schedule 17.08.2018
comment
@PeterSchott - Вы правы - сценарии Pre/Post будут отображать все указанные сценарии в один набор файлов Pre/Post внутри DACPAC. Ссылки на подмодули в постскриптуме, тем не менее, препятствуют успешной сборке и созданию нашего DACPAC вообще. Мы разместили проблему на странице сообщества разработчиков MS, чтобы узнать, сможем ли мы получить официальный ответ; Я обновлю этот пост в стеке, если там что-то случится: .html" rel="nofollow noreferrer">developercommunity.visualstudio.com/content/problem/311982/   -  person Jeff Lewis    schedule 17.08.2018
comment
На скольких коробках это должно работать? Есть ли шанс, что символическая ссылка может сделать это для вас? (ужасная идея, но если это так или копирование файлов в каждую папку) Я все еще думаю, что для того, что вы описываете, составные проекты могут быть лучшим решением. Общие вещи в одном проекте и специфичные для БД вещи в другом.   -  person Peter Schott    schedule 18.08.2018


Ответы (2)


Мы решили обойти эту проблему, используя предложенное Петером Шоттом исправление в комментариях к исходному вопросу — используя относительные пути обратно к подмодулю на диске вместо «виртуальной» ссылки внутри фактической Visual Studio. SQL-проект.

person Jeff Lewis    schedule 16.10.2018

Я искал, как организовать проект SSDT с помощью подмодулей, и нашел ваш вопрос. Я сделал некоторые реализации, но я использовал «виртуальную» ссылку внутри фактического проекта Visual Studio SQL. Вот мои тестовые проекты.

В .sqlproj я добавил:

<Build Include="Core\**\*.sql" Exclude="Core\**\*PostDepl*.sql" />

А в проекте PostDeploy Script я добавил ссылку на Core PostDeploy Script:

:r .\Core\Script.PostDeploymentPopulateData.sql
person Evgeny Gnevashev    schedule 17.02.2019