Megosztás a következőn keresztül:


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éke false. 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 Easytulajdonsá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 TaskParameterValueSetByTask. 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.