2014-06-24 21 views
38

Tôi có một dự án thư viện và một ứng dụng. Tôi muốn có 2 hương vị sản phẩm (cửa hàng, dev) cho cả thư viện và ứng dụng. Khi tôi tạo cửa hàng cho ứng dụng tôi muốn sử dụng cửa hàng từ thư viện. Ngoài ra, khi tôi tạo hương vị dev cho ứng dụng tôi muốn sử dụng hương vị dev từ thư viện. Tôi đã thử đặt cùng một hương vị sản phẩm cho cả thư viện và ứng dụng nhưng nó không hoạt động.Gradle: thêm phụ thuộc cho một hương vị cụ thể của thư viện

Dưới đây là cấu hình của tôi:

Thư viện

apply plugin: 'android-library' 

android { 
    compileSdkVersion 19 
    buildToolsVersion "19.1.0" 

    defaultConfig { 
     applicationId "ro.amarkovits.graddletest.lib" 
     minSdkVersion 14 
     targetSdkVersion 19 
     versionCode 1 
     versionName "1.0" 
    } 
    buildTypes { 
     release { 
      runProguard false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
    productFlavors{ 
     store{ 

     } 
     dev{ 

     } 
    } 

} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
} 

và tôi có file này: src/main/res/values ​​/ strings.xml và src/cửa hàng/res/values ​​/ strings.xml

Ứng dụng

apply plugin: 'android' 

android { 
    compileSdkVersion 19 
    buildToolsVersion '19.1.0' 
    defaultConfig { 
     applicationId 'ro.amarkovits.mymodule.app' 
     minSdkVersion 14 
     targetSdkVersion 19 
     versionCode 1 
     versionName '1.0' 
    } 
    buildTypes { 
     release { 
      runProguard false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
    productFlavors{ 
     store{ 

     } 
     dev{ 

     } 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile project(':lib') 
} 

Trong trường hợp này, tôi gặp lỗi này: Lỗi: (12, 23) Không tìm thấy tài nguyên nào khớp với tên đã cho (tại 'văn bản' có giá trị '@ string/app_name'). Các app_name được định nghĩa trong string.xml trong thư viện (trong cả hai chínhcửa hàng thư mục)

Nếu tôi loại bỏ các productFlavors từ thư viện nó được xây dựng nhưng luôn luôn sử dụng values.xml từ chính thư mục

+0

tôi thay đổi nội dung câu hỏi của tôi với các chi tiết – amarkovits

+0

Bạn đã tìm thấy một giải pháp? – galex

+0

@galex no, và tôi ngừng tìm kiếm – amarkovits

Trả lời

52

Trong thư viện của bạn, bạn cần phải nói cho gradle để xây dựng mỗi khi mỗi biến thể:

android { 
    publishNonDefault true 
} 

Sau đó, trong ứng dụng của bạn, vì gần đây tôi đoán, bạn có thể làm điều này:

dependencies { 
    (...) 
    devCompile project(path: ':lib', configuration: 'devDebug') // or 'devRelease' 
    storeCompile project(path: ':lib', configuration: 'storeRelease') // or 'storeDebug' 
} 

Tìm thấy trong tài liệu chính thức dưới Library Publication.

Edit:

Kể từ phiên bản 0.14.3 (2014/11/18), bây giờ bạn có thể có Flavor-buildType-Compile chỉ thị cũng như:

Trong build.gradle của bạn trước khi phạm vi android {} thêm như sau:

configurations { 
    devDebugCompile 
    devReleaseCompile 
    storeDebugCompile 
    storeReleaseCompile 
} 

Sau đó, bạn có thể khai báo và sử dụng các phiên bản khác nhau của thư viện của mình trên mỗi loại Flavor-BuildType:

dependencies { 
    (...) 
    devDebugCompile project(path: ':lib', configuration: 'devDebug') 
    devReleaseCompile project(path: ':lib', configuration: 'devRelease') 
    storeDebugCompile project(path: ':lib', configuration: 'storeDebug') 
    storeReleaseCompile project(path: ':lib', configuration: 'storeRelease') 
} 

Chỉnh sửa:

Quản lý phụ thuộc giữa các mô-đun đã thay đổi kể từ Android Gradle Plugin 3.0.0.Nó tự động cố gắng để phù hợp với hương vị giữa ứng dụng của bạn và các thư viện/mô-đun nó phụ thuộc vào.

Xem documentation for the whole explanation!

+3

Bất kỳ ý tưởng làm thế nào để làm điều này để devDebug sử dụng devDebug, và devRelease sử dụng devRelease (không có ý nghĩa trong trường hợp này, nhưng không cho trường hợp sử dụng của tôi)? –

+0

Không có "mỗi biến thể", chỉ có từ khóa biên dịch theo từng loại hoặc mỗi loại buildType bây giờ. – galex

+0

@KevinDiTraglia Tôi chỉnh sửa câu trả lời của tôi như những gì bạn yêu cầu thực sự bây giờ tồn tại – galex

1

Tôi đã gặp vấn đề tương tự cách đây một thời gian, điều xảy ra là trình biên dịch bỏ qua các hương vị sản phẩm cho dự án thư viện. Hơn nữa, ngay cả khi bạn thêm các kiểu xây dựng khác, nó vẫn tiếp tục tìm và biên dịch các nguồn phát hành/gỡ lỗi.

Lý do rất đơn giản:

  • hương vị sản phẩm không được hỗ trợ cho plugin thư viện.
  • Các loại xây dựng duy nhất được hỗ trợ dường như là gỡ lỗi và phát hành.

Trình biên dịch sẽ không bao giờ tìm bất kỳ thứ gì bạn đặt trong thư mục cửa hàng của dự án thư viện của bạn. Vì vậy, bạn cần phải tìm một cách xung quanh nó.

Một cách xung quanh nó sẽ bao gồm cả triển khai với mức trừu tượng trong thư viện của bạn (thông qua giao diện, nhiều nhà xây dựng, v.v.) và sau đó để dự án ứng dụng của bạn quyết định phần nào của thư viện sẽ chạy. Nếu bạn sử dụng proguard, nó sẽ tự động loại bỏ các mã không cần thiết, nếu nó được tách ra đủ tốt (và có thể vì vậy ngay cả khi nó không phải là).

4

Để xác định sự phụ thuộc cụ thể cho từng hương vị, bạn có thể sử dụng "nameOfTheFlavorCompile" thay vì "biên dịch"

dependencies { 
    storeCompile project(':lib') 
} 
Các vấn đề liên quan