2015-03-07 4 views
16

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

В настоящий момент инструмент запускается во время «события предварительной сборки» в свойствах проекта C#. К сожалению, это событие выполняется только в том случае, если проект устарел, а это не то, что мне нужно.

Я работаю над этим, всегда используя «rebuild» вместо «build» на моем проекте, но это утомительно и медленно.

Мне нужно выполнить этот инструмент всегда, независимо от того, является ли проект актуальным или нет. На самом деле, даже до того, как MSBuild даже определяет, является ли проект актуальным, поскольку инструмент изменяет некоторые файлы, включенные в проект, поэтому влияет на актуальный результат проверки.

Есть ли правильный способ сделать это?

+1

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

+1

@ HansPassant Может быть, я перепробовал вопрос. Это сводится к следующему: существует ли способ для _allways_ запускать команду перед сборкой? – kaalus

+1

Для проектов C++ вы можете сделать это, используя Target с атрибутом 'BeforeTargets =" BuildGenerateSources ", для C# вы можете сделать что-то подобное и просто выяснить, какая из многих целей вызывается в сборке, которую вы собираетесь использовать для этого атрибута BeforeTargets. Запустите подробную сборку и проверьте вывод или запустите поиск в Microsoft.CSharp.targets или так. Однако, как говорит Ханс: результаты могут быть не такими, как вы ожидаете – stijn

ответ

31

Вот решение. Определите это свойство в файле проекта:

<DisableFastUpToDateCheck>true</DisableFastUpToDateCheck> 

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

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

+13

Точнее, это должно быть ' true ' – M2X

+0

Почему принятый ответ не является первым ответом на странице? –

+0

это также вызывает сборку, даже если никаких изменений – vip32

4

В проектном уровне, у вас есть три варианта:

1) Предварительная сборка целевого действия

<PropertyGroup> 
    <PreBuildEvent>notepad.exe Foo.txt</PreBuildEvent> 
</PropertyGroup> 

2) нормальный BeforeBuild

<Target Name="BeforeBuild"> 
    <Exec Command="notepad.exe Foo.txt" /> 
</Target> 

3) "привязываются" к «Построить «цель (как предложено stijn)

<Target Name="BeforeBuild2" BeforeTargets="Build"> 
    <Exec Command="notepad.exe Foo.txt" /> 
</Target> 

На самом деле это решение (в случае сборки) не будет работать, потому что DependsOnTargets выполнено ДО BeforeTargets. И именно в DependsOnTargets реальная (CoreBuild) сидит :) Вот почему они изобрели «BeforeBuild» цель;)


В обоих случаях VS проверить, если что-то изменения (файлы до-to Дата). Почему вы хотите запустить внешнюю программу, если ничего не изменилось? Если эта программа работает с файлом (например, «content»), msbuild и VS должны обнаруживать файлы как устаревшие и строить процессы.


К сожалению, IDE (Visual Studio) имеет собственный метод работы с проектами msbuild. Основной механизм один и тот же, но когда выясняется, какой проект построен или нет, или в каком порядке ... VS действуют тотально разные.

Вы можете использовать внешний инструмент и запустить «msbuild» против своего решения или проекта. Это также скомпилирует «правильный путь», а бинарные файлы будут разными, но у вас будут все возможности и возможности MsBuild

+0

Мне нужно запустить внешнюю программу, потому что она обрабатывает очень большое количество файлов в один двоичный файл. Было бы невозможно добавить все эти файлы в проект Visual Studio, поэтому они не находятся в проекте. MSBuild ничего не знает о них. Внешний инструмент имеет свой собственный современный механизм проверки, который проверяет, нужны ли эти файлы для обработки, но он должен работать в первую очередь, а VS не хочет сотрудничать. Слишком много, чтобы спросить ... – kaalus