Частичная перекомпиляция в мире C # - PullRequest
1 голос
/ 25 июля 2010

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

С моей точки зрения, здесь есть две интересные вещи, во-первых, мне интересно, возможно ли подобное в .NET, а именно при запуске тестов.А во-вторых, я хочу знать, что представляет собой механизм для достижения этого.

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

Во второй части я действительно заинтересован в механизме, который используется для достижения частичногокомпиляция в мире Java.Являются ли Java IDE парнями, которые отслеживают изменения в файлах и перекомпилируют только то, что изменилось, или это что-то еще?На самом деле, у меня есть несколько других вопросов, но они могут показаться довольно глупыми, поэтому, возможно, кто-то мог бы просто дать мне хороший справочник, который я могу прочитать о том, как это обрабатывается в Java.

Приветствия, Крис.

РЕДАКТИРОВАТЬ:

Хорошо, я явно не прояснил себя здесь, я не хочу знать, как работает MSBuild, и у меня нет конкретной проблемы с порядком, в котором мои проектыbuild или что строится (Игра с настройками проекта не достаточно детальна для меня).

Что я хотел знать, так это механизм, позволяющий Java-проектам выполнять частичную перекомпиляцию на уровне файлов.

Из моего понимания теперь мне ясно, что Java компилирует каждый файл .java в файл .class (в некоторой промежуточной форме), а затем все файлы классов архивируются вместе как файл Jar.Кроме того, большинство IDE поддерживают эту компиляцию на уровне файлов каждый раз, когда файл сохраняется, а некоторые даже поддерживают выполнение модульных тестов при каждом сохранении (большое время IMO)

Теперь, что касается .NET, я считаю, чтоскомпилированные dll не разделены на этом уровне и вместо этого содержат ВСЕ IL для ВСЕХ скомпилированных классов в проекте в виде одного файла (дайте мне знать, если это не так).

Так что вопрос здесь заключался в том, какие вариантыесть ли для нас, чтобы получить нечто подобное в мире .NET, а именно для выполнения модульных тестов.Единственное, о чем я могу думать, - это чтобы VS отслеживал зависимости на уровне класса и имел небольшие временные сборки, содержащие все зависимости, необходимые для выполнения теста.Любые другие предложения приветствуются.

Ответы [ 3 ]

2 голосов
/ 25 июля 2010

В msbuild нет ничего особенного, он использует стандартную проверку на основе временных меток файлов, чтобы увидеть, нужно ли перестраивать цель.Пока нет файлов исходного кода в проекте имеют обновленную метку времени, он пропустит проект.

Из вашего вопроса не ясно, что вы можете сделать, чтобы испортитьэто до.Надеюсь, вы храните код модульного тестирования в отдельном проекте.Вы можете получить диагностику, чтобы понять, почему msbuild решает восстановить цель.Инструменты + Параметры, Проект и решения, Построение и запуск, измените «Детализация вывода сборки проекта MSBuild» на Диагностика.

1 голос
/ 25 июля 2010

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

Вы можете исключить проекты из общей сборки с помощьюменю сборки ..
Сборка-> Диспетчер конфигурации-> Снимите флажки с проектов, которые вы не хотите собирать всегда.

Также

Существует ограниченный контрольнад этим без использования Конфигураций, если вы отметили опцию только для сборки запускаемых проектов и зависимостей при запуске.
Инструменты -> Параметры -> Проекты и решения -> Построить и запустить -> Только строить запускаемые проекты и зависимости при запуске

0 голосов
/ 12 декабря 2012

Разница в том, что основной единицей скомпилированного кода Java является файл .class, а базовой единицей скомпилированного кода .Net является dll или исполняемый файл.Файл .jar - это просто сжатая иерархия файлов классов, каждый из которых представляет отдельный класс Java.

Это означает, что в нет частичной компиляции в Java, ноединицы, которые должны быть скомпилированы, относительно малы.

Единственный способ создать такой же эффект в проекте .net - разделить его на множество небольших сборок, чего я не могупредставьте себе практичнымМожет быть что-то, чему вы могли бы научиться из поведения .net Dynamic Language Runtime, так как это, вероятно, должно генерировать MSIL на индивидуальной основе, но это было бы сложной задачей, и я не очень много слышал об этом длянесколько лет.

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