Пересборка проекта
От: Аноним  
Дата: 30.11.07 13:21
Оценка:
Проект собирается каждый раз, даже если исходники не поменялись. Как от этого избавиться?

20.02.08 20:02: Перенесено модератором из 'Nemerle' — VladD2
Re: Пересборка проекта
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.12.07 07:45
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Проект собирается каждый раз, даже если исходники не поменялись. Как от этого избавиться?


Есть такая проблема. Что-то не так в файлах проекта. Просто оно не особо напрягало до сих пор, так что никто серьезно ею не занимался.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Пересборка проекта
От: Ka3a4oK  
Дата: 01.12.07 22:15
Оценка:
VD>Есть такая проблема. Что-то не так в файлах проекта. Просто оно не особо напрягало до сих пор, так что никто серьезно ею не занимался.

Напрягает еще как! Я написал утилиту на Nemerle, которая по текствовому файлу генерит некоторый исходник, который компилируется и линкуется в некий С++ проект. Так вот в связи с этой проблемой: перекомпилируется утилита -> перегенерируется исходник -> пересобирается С++ проект. Это очень и очень напрягает. Пришлось разорвать цепочку зависимостей и потерять в автоматизации.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[3]: Пересборка проекта
От: VladD2 Российская Империя www.nemerle.org
Дата: 02.12.07 09:43
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:

KK>Напрягает еще как! Я написал утилиту на Nemerle, которая по текствовому файлу генерит некоторый исходник, который компилируется и линкуется в некий С++ проект. Так вот в связи с этой проблемой: перекомпилируется утилита -> перегенерируется исходник -> пересобирается С++ проект. Это очень и очень напрягает. Пришлось разорвать цепочку зависимостей и потерять в автоматизации.


Ясно. Опять С++ .
Ладно, попробую поглядеть на следующей неделе.

В принципе, если есть опыт с MSBuild, то можешь и сам попробовать. Там дело именно в файлах проекта, так как через MSBuild проекты тоже каждый раз перекомпилируются.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Пересборка проекта
От: Ka3a4oK  
Дата: 02.12.07 10:54
Оценка:
VD>Ясно. Опять С++ .
Он, родимый. Пока без него никак. Скорость зубодробительная нужна. Исходники для того и генерятся — для зубодробительной скорости.

VD>Ладно, попробую поглядеть на следующей неделе.

Заранее спасибо.

VD>В принципе, если есть опыт с MSBuild, то можешь и сам попробовать. Там дело именно в файлах проекта, так как через MSBuild проекты тоже каждый раз перекомпилируются.

Я хочу приступить работать над интеграцией или компилятором. Внести "личный вклад в общее дело". Но есть пока ряд проблем, которые для этого нужно решить. Недельки через 2, надеюсь, начну.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[5]: Пересборка проекта
От: Ka3a4oK  
Дата: 02.12.07 13:32
Оценка:
KK>Я хочу приступить работать над интеграцией или компилятором. Внести "личный вклад в общее дело". Но есть пока ряд проблем, которые для этого нужно решить. Недельки через 2, надеюсь, начну.

Приступить к работе, конечно.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re: Пересборка проекта
От: Алексей П Россия  
Дата: 20.02.08 08:58
Оценка: 137 (3)
Здравствуйте, Аноним, Вы писали:

А>Проект собирается каждый раз, даже если исходники не поменялись. Как от этого избавиться?


Обнаружил, что проблема до сих пор актуальна. Экспериментально нашел, в чем дело.
Итак, файл Nemerle.MSBuild.targets:

<Target
        Name="CoreCompile"
        Inputs="$(MSBuildAllProjects);                 // убрать
                @(Compile);
                @(ManifestResourceWithNoCulture);
                $(ApplicationIcon);
                $(AssemblyOriginatorKeyFile);
                @(ManifestNonResxWithNoCultureOnDisk);
                @(ReferencePath);
                @(CompiledLicenseFile);
                @(EmbeddedDocumentation);                
                @(CustomAdditionalCompileInputs)"
        Outputs="@(DocFileItem);
                 @(IntermediateAssembly);
                 $(NonExistentFile);                   // убрать
                 @(CustomAdditionalCompileOutputs)"
        DependsOnTargets="$(CoreCompileDependsOn)"     
    >


После этого всё пересобирается только при изменениях.
Re[2]: Пересборка проекта
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.02.08 16:25
Оценка:
Здравствуйте, Алексей П, Вы писали:


АП>
АП><Target
АП>        Name="CoreCompile"
АП>        Inputs="$(MSBuildAllProjects);                 // убрать
АП>


Хм. Это наверно сделано чтобы проект пересобирался при изменениях зависимых проектах. Хотя... где бы доки по этому делу найти?

АП>После этого всё пересобирается только при изменениях.


Попробую когда оживет SVN.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Пересборка проекта
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.02.08 16:33
Оценка:
Здравствуйте, VladD2, Вы писали:

АП>>
АП>><Target
АП>>        Name="CoreCompile"
АП>>        Inputs="$(MSBuildAllProjects);                 // убрать
АП>>


VD>Хм. Это наверно сделано чтобы проект пересобирался при изменениях зависимых проектах. Хотя... где бы доки по этому делу найти?


Похоже, что в MSBuildAllProjects попадает сам собираемый проект и все его targets-ы. При изменении этих файлов нужно перекомпилировать проект. Так что скорее всего MSBuildAllProjects лучше не выкидывать.

С ним пересборка проектов осуществляется каждый раз?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Пересборка проекта
От: Алексей П Россия  
Дата: 20.02.08 16:37
Оценка:
Здравствуйте, VladD2, Вы писали:

АП>>
АП>><Target
АП>>        Name="CoreCompile"
АП>>        Inputs="$(MSBuildAllProjects);                 // убрать
АП>>


VD>Хм. Это наверно сделано чтобы проект пересобирался при изменениях зависимых проектах. Хотя... где бы доки по этому делу найти?


Гуглом нашел например это. Похоже, MSBuildAllProjects — это список всех targets-файлов, о которых знает мсбилд. Но не факт. А зависимые проекты лежат в переменной ReferencePath, и она в инпутах тоже есть.
В принципе, присутствие списка таргетов в инпутах не должно бы вызывать постоянные ребилды, но почему-то вызывает.
Re[4]: Пересборка проекта
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.02.08 16:57
Оценка:
Здравствуйте, Алексей П, Вы писали:

АП>Гуглом нашел например это. Похоже, MSBuildAllProjects — это список всех targets-файлов, о которых знает мсбилд. Но не факт. А зависимые проекты лежат в переменной ReferencePath, и она в инпутах тоже есть.

АП>В принципе, присутствие списка таргетов в инпутах не должно бы вызывать постоянные ребилды, но почему-то вызывает.

Ага.

Наверно дело в файле Nemerle.MSBuild.targets
Там (как описано в этом блоге) эта переменная переопределяется:
<MSBuildAllProjects>$(MSBuildAllProjects);Nemerle.MSBuild.targets</MSBuildAllProjects>

И скорее всего Nemerle.MSBuild.targets ищется где-то не там. Наверно надо писать так:
<MSBuildAllProjects>$(MSBuildAllProjects);$(Nemerle)\Nemerle.MSBuild.targets</MSBuildAllProjects>

Тогда файл будет находиться и проблем возникать не должно.

Кстати, похожая проблема была в Wix-е:
http://66.102.9.104/search?q=cache:LQJe755yysgJ:osdir.com/ml/windows.devel.wix.devel/2006-09/msg00057.html+MSBuildAllProjects&amp;hl=ru&amp;ct=clnk&amp;cd=10&amp;gl=ru
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Пересборка проекта
От: Алексей П Россия  
Дата: 20.02.08 17:20
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Наверно дело в файле Nemerle.MSBuild.targets

VD>Там (как описано в этом блоге) эта переменная переопределяется:
VD>
<MSBuildAllProjects>$(MSBuildAllProjects);Nemerle.MSBuild.targets</MSBuildAllProjects>

VD>И скорее всего Nemerle.MSBuild.targets ищется где-то не там. Наверно надо писать так:
VD>
<MSBuildAllProjects>$(MSBuildAllProjects);$(Nemerle)\Nemerle.MSBuild.targets</MSBuildAllProjects>

VD>Тогда файл будет находиться и проблем возникать не должно.

Помогло. Только интересно, почему он, не найдя входной файл, пересобирает проект?
Re[6]: Пересборка проекта
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.02.08 12:32
Оценка:
Здравствуйте, Алексей П, Вы писали:

АП>Помогло.


Отлично, значит надо не забыть поправить таргет-файл как СВН поднимется.

АП>Только интересно, почему он, не найдя входной файл, пересобирает проект?


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

По уму при отсутствии таргет-файла нужно вообще сообщать об ошибке и прекращать компиляцию.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Пересборка проекта
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.02.08 16:09
Оценка:
Здравствуйте, VladD2, Вы писали:

В общем, залил в SVN исправленный таргет-файл. У меня на тестовом проекте вроде бы все работает.

Зачем нужн NonExistentFile я так и не понял. Информации — ноль.
Пока что просто убрал его. Если кто объяснит его предназначение, то можно подумать о его возвращении. С ним же перекомпиляция происходит каждый раз.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Пересборка проекта
От: Алексей П Россия  
Дата: 22.02.08 08:53
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Зачем нужн NonExistentFile я так и не понял. Информации — ноль.

VD>Пока что просто убрал его. Если кто объяснит его предназначение, то можно подумать о его возвращении. С ним же перекомпиляция происходит каждый раз.

Предположу, чтобы как раз пересобиралось — если включить в выходы заведомо несуществующий файл, они всегда будут out-of-date. Вероятно, это использовалось, когда компилятор часто менялся.

Кстати, неплохо бы еще удалить строку
    <Import Project="$(MSBuildBinPath)\Microsoft.Common.targets" />

из таргетов. Из-за нее мсбилд выдает предупреждение:

C:\Program Files\Nemerle\Nemerle.MSBuild.targets(197,13): warning MSB4011: There is a circular reference involving the import of file "C:\Windows\Microsoft.NET\Framework\v2.0.50727\Microsoft.Common.targets". This file may have been imported more than once, or you may have attempted to import the main project file. All except the first instance of this file will be ignored.

Re[9]: Пересборка проекта
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.02.08 12:04
Оценка:
Здравствуйте, Алексей П, Вы писали:

АП>Кстати, неплохо бы еще удалить строку

АП>
АП>    <Import Project="$(MSBuildBinPath)\Microsoft.Common.targets" />
АП>

АП>из таргетов. Из-за нее мсбилд выдает предупреждение:
АП>

АП>C:\Program Files\Nemerle\Nemerle.MSBuild.targets(197,13): warning MSB4011: There is a circular reference involving the import of file "C:\Windows\Microsoft.NET\Framework\v2.0.50727\Microsoft.Common.targets". This file may have been imported more than once, or you may have attempted to import the main project file. All except the first instance of this file will be ignored.


Хм. По уму ее лучше удалить из проектов. Зачем импортировать два таргет-файла, если можно импортировать только один?
В проектах C#-а этого импорта тоже нет.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.