Подтвердить что ты не робот

Сгенерированный (по T4) файл Build Action получает reset для сборки

У нас есть проект базы данных в Visual Studio 2013. В этом проекте есть файл .tt, который генерирует .sql script. Проблема заключается в том, что после генерации действие сборки сгенерированного файла автоматически устанавливается в Build. Если мы изменим его вручную на None, он получит reset для сборки после регенерации (запуск настраиваемого инструмента).

Еще одна странная вещь: это происходит только в том случае, если файл .tt находится в проекте базы данных и в некоторой папке этого проекта (не в корневом каталоге). если файл .tt находится в другом проекте (в любом месте) или в корне проекта базы данных, действие сборки сгенерированного файла не изменяется после регенерации.

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

Я дам вам любые детали, если потребуется.

4b9b3361

Ответ 1

Как хранится действие сборки? В csproj Примечание. Скомпилируйте созданный файл класса с действием сборки компиляции

Примечание. Скомпилируйте generateFile.cs с действием сборки None

Итак, теперь установите его в None.

Хорошо один шаблон T4, который изменяет sqlproj. Примечание.. Это сохранение нового файла для sqlproj вместо написания вашего существующего sqlproj, как вы хотите, как минимум:

  • Резервное копирование sqlproj
  • Тестирование нового файла
  • Измените это для резервного копирования sqlproj на всякий случай.
  • У вас есть уникальное имя файла в качестве цели.
  • Имейте это как отдельный шаблон T4
  • Запустите это после своего настраиваемого инструмента

        <#@ template debug="true" hostSpecific="true" #>
        <#@ output extension=".cs" #>
        <#@ Assembly Name="System.Core" #>
    
        <#@ import namespace="System" #>
        <#@ import namespace="System.IO" #>
        <#@ import namespace="System.Collections.Generic" #>
    
        <# 
        string file  = @"C:\...\MyProject.sqlproj";
    
    
    
            string [] lines = System.IO.File.ReadAllLines(file);
    
    
            //relative path of file you want to change build action
            string target = @"Models\GeneratedClass.cs";
            //find the line that has your class 
            for(int i = 0; i < lines.Length ; i++)
            {
    
                if(lines[i].Contains(target))
                {
                    //Replace Compile with None
                    lines[i].Replace("Compile", "None");
    
                }
            }
    
            string templateDirectory = Path.GetDirectoryName(Host.TemplateFile);
            string outputFileName = "newCSProj.sqlproj";
            string outputFilePath = Path.Combine(templateDirectory, outputFileName);
    
            File.WriteAllLines(outputFilePath, lines); 
    
      #>
    

Вот предупреждение, которое демонстрирует Visual Studios перед запуском текстового шаблона

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

Ответ 2

Этот ответ был упомянут в комментариях, но кто-то мог его пропустить. Изменено выходное расширение, например. ".sqlscript" и по умолчанию Build Action будет None.

<#@ output extension=".sqlscript" #>

Вы также можете изменить редактор по умолчанию для этого расширения на

"Инструменты данных Microsoft SQL Server, редактор T-SQL"

чтобы вы могли читать и редактировать его как стандартный T-SQL script. Просто зайдите в

Инструменты → Параметры.. → Текстовый редактор → Расширения файлов.

Он не решает проблему с файлами .sql, но это хороший метод обхода и отлично работает для меня. Я тестировал его в VS2015, но он, вероятно, работает аналогично в VS2013.