# Eigene Ant-Tasks in Buckminster



## felix1772 (2. Mrz 2010)

Hallo 

Ich versuche mit Buckminster und Hudson einen Build zu automatisieren. Dabei sollen aus einem ecore-Modell die entsprechenden EMF-Projekte generiert werden (über den entsprechenden Ant-Task, den habe ich als Action in der cspex-Datei). Mein Problem ist nun, dass der import von site.cquery diese Projekte bereits nicht finden kann. Aber wenn ich diese Prozedur vor dem Import anstoßen möchte, ist das site-Plugin Buckminster noch nicht bekannt. Wie kann ich dieses Problem am besten angehen? Muss ich vielleicht in der cspex-Datei etwas bei generators angeben? Oder alterArtifacts? ???:L
Vielen Dank für Eure Hilfe.


----------



## Wildcard (3. Mrz 2010)

Generator ist das richtige Stichwort. Du gibst damit an, diese Component erzeugt (generiert) weitere Components. Wenn also deine Component X die EMF Projekte Y und Z erzeugen soll, muss X mit einer cspex angereichert werden die Buckminster darüber informiert das X die beiden Y und Z on the fly erstellen kann.
Wenn also irgendwo eine Dependency auf Y deklariert wurde ist klar das zuerst X angezogen werden muss, der Generator ausgeführt werden und dann ist Y verfügbar.
Das ist allerdings eines der fortgeschrittenen Themen, du solltest mal im Bucky Book nachschauen.


----------



## felix1772 (4. Mrz 2010)

Werde ich machen, vielen Dank schon mal für den Wink mit dem Zaunpfahl 

Bisher habe ich mich an dieses Tutorial gehalten. Dazu sind mir noch zwei Fragen unklar:

1. Wenn der Schritt "p2.site" abgeschlossen ist und "create.product" aufgerufen wird, erhalte ich diesen Fehler:


> !ENTRY org.eclipse.equinox.p2.artifact.repository 4 1000 2010-03-03 23:04:07.685
> !MESSAGE No repository found at file:/.../workspace/buckminster.output/...feature/site.p2/.
> 
> !ENTRY org.eclipse.equinox.p2.core 4 0 2010-03-03 23:04:07.686
> !MESSAGE Unable to load repositories.


Kann mir jemand einen Tipp geben, woran das liegen könnte?

2. Kann es sein, dass diese Alternative etwas "sauberer" aufgebaut ist? Insbesondere was die Konfiguration des Cross-Plattform Builds angeht, und dass das alles überhaupt mit mspec läuft.

Viele Grüße
Felix


----------



## Wildcard (4. Mrz 2010)

Steht der Pfad wirklich genau so da?

```
!MESSAGE No repository found at file:/.../workspace/buckminster.output/...feature/site.p2/.
```
Sieht etwas seltsam aus, wo kommen die ... her?


> 2. Kann es sein, dass diese Alternative etwas "sauberer" aufgebaut ist? Insbesondere was die Konfiguration des Cross-Plattform Builds angeht, und dass das alles überhaupt mit mspec läuft.


Ich weiß nicht wie objektiv meine Antwort zu diesem Thema sein könnte, da die 'Alternative' von mir stammt 
Grundsätzlich gilt, viele Wege führen nach Rom. Überleg dir was am besten zu deinen Anforderungen passt.


----------



## felix1772 (8. Mrz 2010)

Ich habe zwischenzeitlich mit den "generator"-Angaben in der CSPEX-Datei experimentiert.

Kurz zum Aufbau:
  (1) com.example.emf.model/model enthält die EMF ecore- und genmodel-Dateien
  (2) com.example.build enthält die Buckminster-Dateien

Das EMF SDK ist in der Target Plattform vorhanden. Wenn ich das edit-Plugin per SVN bereitstelle, funktioniert der Build auch komplett.

Im Build-Plugin habe ich in der Datei build/additions.ant die folgenden Angaben:
[XML]
<project>
    <target name="create.emf.bundles">
        <emf.Ecore2Java
        	model="${modelProjectPath}/model/structure.ecore"
            genModel="${modelProjectPath}/model/structure.genmodel"

            reconcileGenModel="reload"
            modelProject="${modelProject}"
            modelProjectFragmentPath="src"
            modelPluginID="${modelProject}"
            generateJavaCode="true"
            generateModelProject="true"
            generateEditProject="true"
            generateEditorProject="true">
            <arg line="-editProject ${modelProject}.edit src"/>
            <arg line="-editorProject ${modelProject}.editor src"/>
            <arg line="-testsProject ${modelProject}.tests src"/>
            <arg line="-validateModel true"/>
        </emf.Ecore2Java>
    </target>
</project>
[/XML]

In der Datei buckminster.cspex steht folgende Action:
[XML]
        <public name="create.emf.bundles" actor="ant">
            <actorProperties>
                <property key="buildFile" value="build/additions.ant" />
                <property key="targets" value="create.emf.bundles" />
            </actorProperties>
            <properties>
                <property key="modelProject" value="com.example.emf.model" />
                <property key="modelProjectPath" value="../${modelProject}" />
            </properties>
            <products alias="destination" base="${buckminster.output}">
                <path path="AAA_emftest/" />
            </products>
        </public>
[/XML]
Wie man sieht, ist die Angabe des Ausgabepfades (AAA_emftest/) noch zum Testen.

Ich kann diese Action mit Buckminster > Invoke Action auch ausführen. Ich habe sie dann als Generator registriert:
[XML]
        <generator
            attribute="create.emf.bundles"
            generates="com.example.emf.model.edit"
        />
        <generator
            attribute="create.emf.bundles"
            generates="com.example.emf.model.editor"
        />
        <generator
            attribute="create.emf.bundles"
            generates="com.example.emf.model.tests"
        />
[/XML]
Edit: das component-Attribut habe ich weggelassen, weil die Action ja im build-Plugin hinterlegt ist.

Das Ergebnis war, dass Buckminster im Build das edit-Plugin nach wie vor über die RMAP auflösen wollte. Daher habe ich dann die entsprechenden Components in den Dependencies eingetragen:
[XML]
        <dependency name="com.example.emf.model" componentType="osgi.bundle"/>
        <dependency name="com.example.emf.model.edit" componentType="osgi.bundle"/>
[/XML]

Dies hat jedoch nichts bewirkt in der Auflösung.

Ich habe dann in Hudson bei dem Build-Step (Buckminster-Plugin) einmal vor dem Auflösen der site.cquery-Datei bereits die Action aufgerufen mit

```
perform com.example.build#create.emf.bundles
```
Diese wurde dann auch aufgerufen, aber der Ant-Task von EMF kann nicht gefunden werden. Die folgende Meldung erscheint:



> Actions to perform (in order)
> com.example.build:eclipse.feature$1.0.0.qualifier#create.emf.bundles
> Action com.example.build:eclipse.feature$1.0.0.qualifier#create.emf.bundles using 'up to date' policy DEFAULT: Rebuild needed: Product has folders
> init actor: ant[com.example.build:eclipse.feature$1.0.0.qualifier#create.emf.bundles]
> ...




Naja, das Ziel ist es ja eigentlich, dass Buckminster das selbstständig antriggert und ich gar nicht erst mit einem zusätzlichen Kommando arbeite.
Habe ich bei der Generator-Definition etwas falsch gemacht? Wie kann ich das debuggen? Bin um jede Hilfe dankbar.


----------



## Wildcard (8. Mrz 2010)

Zum generator resolution Problem kann ich dir erstmal nichts sagen, da ich noch keine Generator verwendet habe. Frag mal in der Newsgroup nach wenn im Bucky Book nichts steht.
Das Problem mit dem Ant-Task ist ein Classpath Problem. Wie schaut denn dein Taskdef im Ant-Script aus?
Am besten wird es sein das EMF Jar das den Ant-Task bereitstellt als extra Dependency in der CSPEX einzutragen und dann im Build Script zu verwenden.


----------

