2011-05-27 12 views
5

Projekt C++, nad którym pracuję (który przekonwertowałem z VS2008 na VS2010) używał kilku plików vcbuild .rules do określania niestandardowych reguł kompilacji. Te pliki .rules miały specyficzną właściwość "AdditionalDependencies" dla węzła CustomBuildRule, która określała listę plików, które powinny być brane pod uwagę przy opracowywaniu, czy cel wymaga przebudowy, czy też nie. Te "dodatkowe zależności" zostały wiernie przeniesione do odpowiedniego pliku .props podczas konwersji VS2010.W jaki sposób mogę wykonać niestandardowe wykonanie narzędzia MSBuild Target w oparciu o sygnaturę czasową pliku?

Plik .targets powiązany z niestandardową regułą budowania dodaje te AdditionalDependencies do właściwości Inputs węzła Target. Zapewnia to wykonanie celu w przypadku, gdy którykolwiek z plików wymienionych w zależnościach nie istnieje, ale nie wykonuje celu, jeśli jedna z zależności jest nowsza niż wynik celu. Nie jest to również logicznie poprawne, ponieważ nie wszystkie pliki są faktycznie wejściami, kilka z nich odnosi się do plików wykonywalnych, które mogą być użyte podczas kompilacji celu. W związku z tym mogą zostać sprawdzone w kontroli wersji i będą obecne, ale nowsza wersja pliku musi wywołać przebudowę dotkniętego obiektu docelowego.

Węzeł pokazuje właściwość Condition, która powinna działać dobrze dla moich wymagań, ale warunki obsługiwane przez tę właściwość nie pojawiają się po przeprowadzonym już teście "Istniejące".

Czy istnieje warunek, który mogę wykorzystać, który porówna pliki czasowe dwóch plików (lub najlepiej datownik plików aktualnie wymienionych w AdditionalDependencies z plikami wynikowymi Target), a tym samym pozwala mi wywołać make-like "odbudować ten cel, jeśli jest on nieaktualny z tych zależności"?

Odpowiedz

2

proszę przyjrzeć się bliżej do celu Output właściwość:

„MSBuild można porównać znaczniki czasu z plików wejściowych z sygnatury czasowe plików wyjściowych i ustalić, czy pominąć, budować, lub częściowo odbudować cel . w poniższym przykładzie, jeśli każdy plik w @ (CSFile) lista pozycji jest nowszy niż plik hello.exe, MSBuild uruchomi docelowej; w przeciwnym razie zostanie on pominięty:”

<Target Name="Build" 
    Inputs="@(CSFile)" 
    Outputs="hello.exe"> 

    <Csc 
     Sources="@(CSFile)" 
     OutputAssembly="hello.exe"/> 
</Target> 

oryginalnego artykułu i więcej informacji o przyrostowych kompilacjach za pomocą MSBuild można znaleźć here.

+0

Tak, znam właściwości Inputs vs Outputs dla celu. Problem polega na tym, że nawet jeśli właściwość Inputs zawiera nazwę pliku wykonywalnego "generator", a znacznik czasu się zmienia, wyjścia nie muszą być ponownie generowane. –

+1

Być może "nazwa pliku wykonywalnego generatora" we właściwości wejściowej nie reprezentuje ścieżki do pliku, w wyniku czego program MSBuild nie może wykryć zmienionego znacznika czasu. – KimCM

Powiązane problemy