2015-12-18 5 views
7

मैं अपनी प्लगइन को कॉन्फ़िगर करने के लिए new rule based configuration in Gradle को आजमा देना चाहता हूं। प्लगइन का पीछा क्लाउड स्टोरेज जैसे डेटा को Google ड्राइव या S3 जैसे अपलोड कर रहा है। मुझे उपयोगकर्ता द्वारा उपयोग किए जाने वाले प्रत्येक संग्रहण के लिए कॉन्फ़िगरेशन की आवश्यकता है। तो, क्या मैं हासिल करना चाहते हैं:ग्रैडल नियम-आधारित मॉडल नेस्टेड बीन्स सिंटैक्स

model { 
    backup { // this is a container for all storages I want to support 
     googleDrive { 
      clientId = '' 
      clientSecret = '' 
      accessToken = '' 
      refreshToken = '' 
     } 

     s3 { 
      // S3 specific config (like API keys) 
     } 
    } 
} 

मेरी प्लगइन में मैं backup तत्व के लिए नियम स्रोत कॉन्फ़िगर करें:

class BackupPlugin implements Plugin<Project> { 

    static class Rules extends RuleSource { 
     @Model 
     void backup(BackupPluginExtension backupModel) {} 
    } 
} 

@Managed 
interface BackupPluginExtension { 
    GoogleDrive getGoogleDrive() 

    void setGoogleDrive(GoogleDrive googleDrive) 
} 

@Managed 
interface GoogleDrive { 
    String getClientId() 

    void setClientId(String clientId) 

    String getClientSecret() 

    void setClientSecret(String clientSecret) 

    String getAccessToken() 

    void setAccessToken(String accessToken) 

    String getRefreshToken() 

    void setRefreshToken(String refreshToken) 
} 

लेकिन, वह कह रही है काम नहीं करता: Could not find method googleDrive() for arguments [[email protected]1b06ac95] on root project 'test'.। ऐसा लगता है कि यह backup के अंदर विधियों को कॉल करने का प्रयास करता है और नेस्टेड सेम कॉन्फ़िगर नहीं करता है।

तो, इसके लिए सही वाक्यविन्यास क्या है?

मुझे नामित संग्रह के बारे में पता है, लेकिन सवाल यह है कि कस्टम बीन पदानुक्रमों को कैसे कॉन्फ़िगर करें।

+1

'build.gradle' से [यहां] (https://github.com/Opalo/stackoverflow/tree/master/34359856) अच्छी तरह से संकलित करता है। क्या आपके पास समस्याग्रस्त फ़ाइल का एक उदाहरण है? – Opal

+0

@ ओपल, नहीं, ऐसा नहीं है। './gradlew build' Gradle के आलसी स्वभाव की वजह से ./gradlew model' बलों मॉडल पदानुक्रम का निर्माण करने और काम कर सकते हैं, लेकिन' के साथ विफल: 'विधि का कोई हस्ताक्षर नहीं:) BackupPluginExtension.googleDrive (तर्क प्रकार के लिए लागू होता है: (build_dg6xcmwhd5yulrz1952ef2hf7 $ _run_closure1 $ _closure2 $ _closure3) मान: [build_dg6xcmwhd5yulrz1952ef2hf7 $ _run_closure1 $ _closure2 $ _closure3 @ 6b95c03e] ' – madhead

+0

एक नज़र होगा :) – Opal

उत्तर

2

थोड़ी देर के लिए इसके साथ खेलने के बाद, ऐसा लगता है कि बनाने googleDriveकेवल पढ़ने के लिए (अर्थात setGoogleDrive() सेटर को हटाने के द्वारा) आपकी समस्या को (जब gradle model चल रहा BUILD सफल प्राप्त) ठीक करता है।

और कुछ मामूली संशोधनों के बाद (Plugin.apply के बजाय @Mutate का उपयोग कर), यह इस तरह दिखता है:

apply plugin: BackupPlugin 

class BackupPlugin extends RuleSource { 
    @Model 
    void backup(BackupPluginExtension backupModel) { 
    } 

    @Mutate void createTasks(ModelMap<Task> tasks, BackupPluginExtension model) { 
     tasks.create("backup") { 
      doLast { 
       // ... do stuff 
       println "googleDrive.clientId = ${model.googleDrive.clientId}" 
      } 
     } 
    } 
} 

@Managed 
interface BackupPluginExtension { 
    GoogleDrive getGoogleDrive() 

// void setGoogleDrive(GoogleDrive googleDrive) 
} 

@Managed 
interface GoogleDrive { 
    String getClientId() 

    void setClientId(String clientId) 

    String getClientSecret() 

    void setClientSecret(String clientSecret) 

    String getAccessToken() 

    void setAccessToken(String accessToken) 

    String getRefreshToken() 

    void setRefreshToken(String refreshToken) 
} 

model { 
    backup { // this is a container for all storages I want to support 
     googleDrive { 
      clientId = 'someId' 
      clientSecret = '' 
      accessToken = '' 
      refreshToken = '' 
     } 

    } 
} 

इस पर gradle backup रनिंग प्रिंट googleDrive.clientId = someId

+0

बहुत बढ़िया! धन्यवाद! बस मैं यह चाहता हूं। – madhead

+0

इसके अलावा, इस उत्तर पर महत्वपूर्ण नोट। यह अभी भी Gradle 2.9 के साथ काम नहीं करता है (जब मैंने प्रश्न पूछा तो मैंने उस संस्करण का उपयोग किया), लेकिन 2.12 में काम करता है। तो, समस्या न केवल वाक्यविन्यास थी, लेकिन उन्होंने कुछ भी ग्रिडल के अंदर बदल दिया है :) – madhead

2

यहां ग्रैडल पैकेज samples/modelRules/ruleSourcePluginEach/ से प्रेरित बीन पदानुक्रम संग्रह का एक आदर्श उदाहरण है।

BackupStorageGoogleDrive और S3 स्टोरेज दोनों के लिए सामान्य विशेषताओं में शामिल हैं।

apply plugin: BackupPlugin 

model { 
    backup { 
     storage1(GoogleDrive) { 
      clientId = '1' 
      clientSecret = '' 
      accessToken = '' 
      refreshToken = '' 
     } 
     storage2(S3) { 
      clientId = '2' 
     } 
     storage3(GoogleDrive) { 
      clientId = '3' 
      clientSecret = '' 
      accessToken = '' 
      refreshToken = '' 
     } 
    } 
} 

class BackupPlugin implements Plugin<Project> { 

    void apply(Project p) { } 

    static class Rules extends RuleSource { 
     @Model void backup(ModelMap<BackupStorage> bs) { 
     } 
    } 
} 

@Managed 
interface BackupStorage { 
    String getClientId() 
    void setClientId(String clientId) 
} 

@Managed 
interface GoogleDrive extends BackupStorage { 
    String getClientSecret() 
    void setClientSecret(String clientSecret) 

    String getAccessToken() 
    void setAccessToken(String accessToken) 

    String getRefreshToken() 
    void setRefreshToken(String refreshToken) 
} 

@Managed 
interface S3 extends BackupStorage { 
} 
+0

यह भी काम करता है, लेकिन मैंने एक और जवाब स्वीकार कर लिया है क्योंकि यह वही है जो मैं चाहता हूं। – madhead

संबंधित मुद्दे