Növekményes felépítések
Az MSBuild növekményes buildek olyan buildek, amelyek úgy vannak optimalizálva, hogy azokat a célokat, amelyek kimeneti fájljai up-todátummal rendelkeznek a megfelelő bemeneti fájlokra vonatkozóan, ne hajtsák végre.
A célelem rendelkezhet egy Inputs
attribútummal is, amely azt jelzi, hogy a cél milyen elemeket vár bemenetként, valamint egy Outputs
attribútumot, amely azt jelzi, hogy milyen elemeket állít elő kimenetként. Az MSBuild megkísérli megkeresni az attribútumok értékei közötti egy-az-egyhez megfeleltetést. Ha létezik ilyen leképezés, az MSBuild minden bemeneti elem időbélyegét összehasonlítja a megfelelő kimeneti elem időbélyegével. Az egy-az-egyhez leképezéssel nem rendelkező kimeneti fájlokat a rendszer az összes bemeneti fájlhoz hasonlítja. Az elemek akkor tekinthetők up-todátumnak, ha a kimeneti fájl ugyanolyan korú vagy újabb, mint a bemeneti fájl vagy fájlok.
Jegyzet
Amikor az MSBuild kiértékeli a bemeneti fájlokat, a rendszer csak a lista tartalmát veszi figyelembe az aktuális végrehajtás során. Az utolsó build lista módosításai nem teszik automatikusan elavulttá a célt.
Ha az összes kimeneti elem up-to-date, az MSBuild kihagyja a célértéket. Ez a cél-növekményes összeállítás jelentősen javíthatja az összeállítás sebességét. Ha csak néhány fájl up-to-date, az MSBuild végrehajtja a célértéket, de kihagyja a up-to-date elemeket, ezért az összes elemet up-to-date fájlba helyezi. Ez a folyamat részleges növekményes buildelésinéven ismert.
Az egy-az-egyhez leképezések csak úgy hozhatók létre, ha a Outputs
attribútumot a Inputs
attribútum átalakításával készíti el. További információért tekintse meg a MSBuild transzformációkat.
Vegye figyelembe a következő célt:
<Target Name="Backup" Inputs="@(Compile)"
Outputs="@(Compile->'$(BackupFolder)%(Identity).bak')">
<Copy SourceFiles="@(Compile)" DestinationFiles=
"@(Compile->'$(BackupFolder)%(Identity).bak')" />
</Target>
A Compile
elemtípus által képviselt fájlok egy biztonsági mentési könyvtárba lesznek másolva. A biztonsági mentési fájlok .bak
fájlnévkiterjesztéssel rendelkeznek. Ha a Compile
elemtípus vagy a megfelelő biztonsági mentési fájlok által képviselt fájlok nem törlődnek vagy módosulnak az Backup
cél futtatása után, akkor a Backup
cél ki lesz hagyva a későbbi buildekben.
Kimeneti következtetés
Az MSBuild összehasonlítja a cél Inputs
és Outputs
attribútumait annak megállapításához, hogy a célnak végre kell-e hajtania. Ideális esetben a növekményes build befejezése után létező fájloknak változatlannak kell maradniuk, függetlenül attól, hogy a társított célokat végrehajtják-e. Mivel a tevékenységek által létrehozott vagy módosított tulajdonságok és elemek hatással lehetnek a buildre, az MSBuildnek akkor is ki kell következnie az értékeiből, ha az őket érintő cél ki van hagyva. Ez a folyamat kimeneti következtetésinéven ismert.
Három eset létezik:
A cél rendelkezik egy
Condition
attribútummal, amelynek az értékefalse
. Ebben az esetben a cél nem fut, és nincs hatással a buildre.A cél elavult kimenetekkel rendelkezik, és futtatva up-to-date értékre.
A cél nem rendelkezik elavult kimenetekkel, ezért a rendszer kihagyja. Az MSBuild kiértékeli a célt, és úgy módosítja az elemeket és tulajdonságokat, mintha a cél futott volna.
A növekményes fordítás támogatásához a feladatoknak gondoskodniuk kell arról, hogy az Output
elem TaskParameter
attribútuma megegyezzen a feladat bemeneti paraméterével. Például:
<CreateProperty Value="123">
<Output PropertyName="Easy" TaskParameter="Value" />
</CreateProperty>
Ez a kód létrehozza a Easy
tulajdonságot, amelynek értéke 123
, függetlenül attól, hogy a cél végrehajtásra kerül vagy átugrásra kerül.
Az MSBuild 3.5-től kezdve a rendszer automatikusan végrehajtja a kimeneti következtetést a cél elem- és tulajdonságcsoportjaiban.
CreateItem
feladatokra nincs szükség a célok között, ezért célszerű elkerülni. Emellett a CreateProperty
feladatokat csak egy célban a cél végrehajtásának ellenőrzésére kell használni.
Az MSBuild 3.5 előtt használhatja a CreateItem feladatot.
Annak meghatározása, hogy egy cél fut-e
A kimeneti következtetés miatt meg kell vizsgálnia a cél tulajdonságait és elemeit annak megállapításához, hogy a cél végrehajtása megtörtént-e. Ehhez adja hozzá a CreateProperty
feladatot a célhoz, és adjon neki egy Output
elemet, amelynek TaskParameter
ValueSetByTask
. Például:
<CreateProperty Value="true">
<Output TaskParameter="ValueSetByTask" PropertyName="CompileRan" />
</CreateProperty>
Ez a kód létrehozza a tulajdonságot CompileRan
, és megadja a true
értéket, de csak akkor, ha a cél végrehajtása történik. Ha a cél ki van hagyva, CompileRan
nem jön létre.