Принудительная перезагрузка файла перед сборкой - PullRequest
4 голосов
/ 30 марта 2010

У нас есть инструмент, который генерирует некоторые файлы кода (.cs), которые используются для создания проекта.

РЕДАКТИРОВАТЬ: Эти файлы являются второй половиной некоторых частичных классов, поэтому процесс сборки требует доступа к источнику. Например, невозможно скомпилировать его в DLL, а затем установить порядок сборки.

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

Пример:

  • Изменить входной файл инструмента
  • Run Build
    • Инструмент Запуск и изменение исходного файла
  • Ошибка сборки
  • Run Build
    • Инструмент Запускает и изменяет исходный файл (но на самом деле он не меняется, потому что ввод остается неизменным)
  • Build Succeeds

Есть какие-нибудь идеи, как мы можем покончить с двойной сборкой, и все же позволить нашему инструменту запускаться из VS?

Спасибо, ребята!

Ответы [ 3 ]

3 голосов
/ 01 апреля 2010

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

В качестве альтернативы (или в сочетании с вышеизложенным), вы можете добавить пользовательский инструмент в меню VS Tool, который запускает ваш инструмент (см. Инструменты-> Внешние инструменты). Затем просто вручную запустите этот пользовательский инструмент перед выполнением сборки - это все еще утомительный двойной шаг, но гораздо быстрее и проще, чем сборка дважды. (и вы, вероятно, сможете оставить свой инструмент запущенным на этапе предварительной сборки, чтобы старый подход двойной сборки все еще работал).

Другой вариант может заключаться в том, чтобы отредактировать скрипт MSBuild для вашего проекта, чтобы он запускал ваш инструмент ранее в процессе сборки, чтобы изменение файла было обнаружено во время сканирования зависимостей (поэтому требуется только один этап сборки). *

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

1 голос
/ 30 марта 2010

рефакторинг вашего soln в 2 проекта: первый ген - это файл cs, второй использует его (как dll).

В первом проекте (называемом Gen) есть 2 события после сборки: 1 для запуска инструмента и повторного создания исходного файла, и 2) компиляция файла src Gen'ed для использования вторым проектом: *

Gen.exe 
csc.exe /target:library Gened.cs

Второй проект (назовите его Use) ссылается на dll и вызывает его.

== Gen.cs

using System.IO;
namespace sm3
{class Gen
{static string bod = "public static int var = 46;";
 static string clas = "public class Gened {" + bod + "}";
 static string ns  = "namespace sm3 {" + clas + "}";
 static void Main(string[] args)
 {StreamWriter SW;
     SW = File.CreateText("Gened.cs");
     SW.WriteLine(ns);
     SW.Close();
    }}}

== Use.cs

using System;
namespace sm3
{class Use
    {static void Main(string[] args)
        {Gened g = new Gened();
         Console.Write(Gened.var.ToString());
         Console.ReadLine();
         }}}
0 голосов
/ 15 февраля 2017

Ответ оказался "Использовать Торт " и Powershell

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...