Sự khác biệt giữa triển khai và biên dịch trong Gradle là gì?

1109
humazed 2017-06-12 21:13.

Sau khi cập nhật lên Android Studio 3.0 và tạo một dự án mới, tôi nhận thấy rằng build.gradlecó một cách mới để thêm các phụ thuộc mới thay vì compileimplementationvà thay vì testCompiletestImplementation.

Thí dụ:

 implementation 'com.android.support:appcompat-v7:25.0.0'
 testImplementation 'junit:junit:4.12'

thay vì

 compile 'com.android.support:appcompat-v7:25.0.0'
 testCompile 'junit:junit:4.12'

Sự khác biệt giữa chúng và những gì tôi nên sử dụng?

9 answers

1358
humazed 2017-06-12 21:13.

tl; dr

Chỉ cần thay thế:

  • compilevới implementation(nếu bạn không cần độ nhạy) hoặc api(nếu bạn cần độ nhạy)
  • testCompile với testImplementation
  • debugCompile với debugImplementation
  • androidTestCompile với androidTestImplementation
  • compileOnlyvẫn còn hợp lệ. Nó đã được thêm vào 3.0 để thay thế được cung cấp và không biên dịch. (được providedgiới thiệu khi Gradle không có tên cấu hình cho trường hợp sử dụng đó và đặt tên nó theo phạm vi cung cấp của Maven.)

Đây là một trong những thay đổi đột phá đến với plugin Android Gradle 3.0 mà Google đã công bố tại IO17 .

Các compilecấu hình được bây giờ bị phản và cần được thay thế bằng implementationhoặcapi

Từ tài liệu Gradle :

dependencies {
    api 'commons-httpclient:commons-httpclient:3.1'
    implementation 'org.apache.commons:commons-lang3:3.5'
}

Sự phụ thuộc xuất hiện trong các apicấu hình sẽ được tiếp xúc một cách tạm thời với người tiêu dùng của thư viện và như vậy sẽ xuất hiện trên đường dẫn biên dịch của người tiêu dùng.

implementationMặt khác, các phụ thuộc được tìm thấy trong cấu hình sẽ không được tiếp xúc với người tiêu dùng và do đó không bị rò rỉ vào đường dẫn biên dịch của người tiêu dùng. Điều này đi kèm với một số lợi ích:

  • phụ thuộc không bị rò rỉ vào classpath biên dịch của người tiêu dùng nữa, vì vậy bạn sẽ không bao giờ vô tình phụ thuộc vào phụ thuộc bắc cầu
  • biên dịch nhanh hơn nhờ kích thước classpath giảm
  • ít biên dịch lại khi các phụ thuộc triển khai thay đổi: người tiêu dùng sẽ không cần phải biên dịch lại
  • xuất bản sạch hơn: khi được sử dụng cùng với plugin maven-Publishing mới, các thư viện Java tạo ra các tệp POM phân biệt chính xác giữa những gì được yêu cầu để biên dịch dựa trên thư viện và những gì cần thiết để sử dụng thư viện trong thời gian chạy (nói cách khác, không trộn những gì cần thiết để biên dịch chính thư viện và những gì cần thiết để biên dịch dựa trên thư viện).

Cấu hình biên dịch vẫn tồn tại, nhưng không nên sử dụng vì nó sẽ không mang lại sự đảm bảo mà cấu hình apiimplementationcấu hình cung cấp.


Lưu ý: nếu bạn chỉ đang sử dụng một thư viện trong mô-đun ứng dụng của mình - trường hợp phổ biến - bạn sẽ không nhận thấy bất kỳ sự khác biệt nào.
bạn sẽ chỉ thấy sự khác biệt nếu bạn có một dự án phức tạp với các mô-đun phụ thuộc vào nhau hoặc bạn đang tạo một thư viện.

404
aldok 2018-01-23 08:55.

Câu trả lời này sẽ chứng minh sự khác biệt giữa implementation, apicompiletrên một dự án.


Giả sử tôi có một dự án với ba mô-đun Gradle:

  • ứng dụng (một ứng dụng Android)
  • myandroidlibrary (một thư viện Android)
  • myjavalibrary (một thư viện Java)

appmyandroidlibrarydạng phụ thuộc. myandroidlibrarymyjavalibrary dạng phụ thuộc.

myjavalibrarycó một MySecretlớp học

public class MySecret {

    public static String getSecret() {
        return "Money";
    }
}

myandroidlibraryMyAndroidComponentlớp thao tác giá trị từ MySecretlớp.

public class MyAndroidComponent {

    private static String component = MySecret.getSecret();

    public static String getComponent() {
        return "My component: " + component;
    }    
}

Cuối cùng, appchỉ quan tâm đến giá trị từmyandroidlibrary

TextView tvHelloWorld = findViewById(R.id.tv_hello_world);
tvHelloWorld.setText(MyAndroidComponent.getComponent());

Bây giờ, hãy nói về các phụ thuộc ...

appcần tiêu thụ :myandroidlibrary, vì vậy trong appsử dụng build.gradle implementation.

( Lưu ý : Bạn cũng có thể sử dụng api / compile. Nhưng hãy giữ suy nghĩ đó một chút.)

dependencies {
    implementation project(':myandroidlibrary')      
}

Bạn nghĩ myandroidlibrarybuild.gradle trông như thế nào? Chúng ta nên sử dụng phạm vi nào?

Chúng tôi có ba lựa chọn:

dependencies {
    // Option #1
    implementation project(':myjavalibrary') 
    // Option #2
    compile project(':myjavalibrary')      
    // Option #3
    api project(':myjavalibrary')           
}

Sự khác biệt giữa chúng và những gì tôi nên sử dụng?

Biên dịch hoặc Api (tùy chọn # 2 hoặc # 3)

Nếu bạn đang sử dụng compilehoặc api. Ứng dụng Android của chúng tôi hiện có thể truy cập myandroidcomponentphụ thuộc, là một MySecretlớp.

TextView textView = findViewById(R.id.text_view);
textView.setText(MyAndroidComponent.getComponent());
// You can access MySecret
textView.setText(MySecret.getSecret());

Triển khai (tùy chọn số 1)

Nếu bạn đang sử dụng implementationcấu hình, MySecretkhông được hiển thị.

TextView textView = findViewById(R.id.text_view);
textView.setText(MyAndroidComponent.getComponent());
// You can NOT access MySecret
textView.setText(MySecret.getSecret()); // Won't even compile

Vì vậy, bạn nên chọn cấu hình nào? Điều đó thực sự phụ thuộc vào yêu cầu của bạn.

Nếu bạn muốn tiết lộ việc sử dụng phụ thuộcapi hoặc compile.

Nếu bạn không muốn để lộ các phụ thuộc (ẩn mô-đun bên trong của bạn) thì hãy sử dụng implementation.

Ghi chú:

Đây chỉ là ý chính của các cấu hình Gradle, tham khảo Bảng 49.1. Plugin Thư viện Java - các cấu hình được sử dụng để khai báo các phụ thuộc để giải thích chi tiết hơn.

Dự án mẫu cho câu trả lời này có sẵn trên https://github.com/aldoKelvianto/ImplementationVsCompile

70
Rishav 2017-06-12 21:37.

Compilecấu hình không được dùng nữa và nên được thay thế bằng implementationhoặc api.

Bạn có thể đọc tài liệu tại https://docs.gradle.org/current/userguide/java_library_plugin.html#sec:java_library_separation .

Phần ngắn gọn là-

Sự khác biệt chính giữa plugin Java tiêu chuẩn và plugin Thư viện Java là plugin sau đưa ra khái niệm về một API tiếp xúc với người tiêu dùng. Thư viện là một thành phần Java được sử dụng bởi các thành phần khác. Đó là một trường hợp sử dụng rất phổ biến trong các bản dựng nhiều dự án, nhưng cũng có thể ngay khi bạn có các phụ thuộc bên ngoài.

Plugin trình bày hai cấu hình có thể được sử dụng để khai báo các phụ thuộc: api và thực thi. Cấu hình api nên được sử dụng để khai báo các phần phụ thuộc được xuất bởi API thư viện, trong khi cấu hình triển khai sẽ được sử dụng để khai báo các phần phụ thuộc bên trong thành phần.

Để giải thích thêm, hãy tham khảo hình ảnh này.

46
Shayan Amani 2018-01-08 11:16.

Giải pháp ngắn gọn:

Cách tiếp cận tốt hơn là thay thế tất cả các compilephụ thuộc bằng các implementationphụ thuộc. Và chỉ những nơi bạn rò rỉ giao diện của mô-đun, bạn mới nên sử dụng api. Điều đó sẽ gây ra ít biên dịch lại hơn rất nhiều.

 dependencies {
         implementation fileTree(dir: 'libs', include: ['*.jar'])
 
         implementation 'com.android.support:appcompat-v7:25.4.0'
         implementation 'com.android.support.constraint:constraint-layout:1.0.2'
         // …
 
         testImplementation 'junit:junit:4.12'
         androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
             exclude group: 'com.android.support', module: 'support-annotations'
         })
 }

Giải thích thêm:

Trước khi có plugin Android Gradle 3.0 : chúng tôi đã gặp phải một vấn đề lớn là một lần thay đổi mã khiến tất cả các mô-đun được biên dịch lại. Nguyên nhân sâu xa của việc này là Gradle không biết liệu bạn có làm rò rỉ giao diện của một mô-đun qua một mô-đun khác hay không.

Sau plugin Android Gradle 3.0 : plugin Android Gradle mới nhất hiện yêu cầu bạn xác định rõ ràng nếu bạn làm rò rỉ giao diện của mô-đun. Dựa vào đó nó có thể đưa ra lựa chọn phù hợp về những gì nó nên biên dịch lại.

Do đó, phần compilephụ thuộc đã không được chấp nhận và được thay thế bằng hai phần mới:

  • api: bạn làm rò rỉ giao diện của mô-đun này thông qua giao diện của riêng bạn, có nghĩa là hoàn toàn giống với phần compilephụ thuộc cũ

  • implementation: bạn chỉ sử dụng mô-đun này trong nội bộ và không bị rò rỉ qua giao diện của bạn

Vì vậy, bây giờ bạn có thể yêu cầu Gradle biên dịch lại một mô-đun một cách rõ ràng nếu giao diện của một mô-đun đã sử dụng có thay đổi hay không.

Được phép của blog Jeroen Mols

25
Wajid 2019-04-10 02:55.
+--------------------+----------------------+-------------+--------------+-----------------------------------------+
| Name               | Role                 | Consumable? | Resolveable? | Description                             |
+--------------------+----------------------+-------------+--------------+-----------------------------------------+
| api                | Declaring            |      no     |      no      | This is where you should declare        |
|                    | API                  |             |              | dependencies which are transitively     |
|                    | dependencies         |             |              | exported to consumers, for compile.     |
+--------------------+----------------------+-------------+--------------+-----------------------------------------+
| implementation     | Declaring            |      no     |      no      | This is where you should                |
|                    | implementation       |             |              | declare dependencies which are          |
|                    | dependencies         |             |              | purely internal and not                 |
|                    |                      |             |              | meant to be exposed to consumers.       |
+--------------------+----------------------+-------------+--------------+-----------------------------------------+
| compileOnly        | Declaring compile    |     yes     |      yes     | This is where you should                |
|                    | only                 |             |              | declare dependencies                    |
|                    | dependencies         |             |              | which are only required                 |
|                    |                      |             |              | at compile time, but should             |
|                    |                      |             |              | not leak into the runtime.              |
|                    |                      |             |              | This typically includes dependencies    |
|                    |                      |             |              | which are shaded when found at runtime. |
+--------------------+----------------------+-------------+--------------+-----------------------------------------+
| runtimeOnly        | Declaring            |      no     |      no      | This is where you should                |
|                    | runtime              |             |              | declare dependencies which              |
|                    | dependencies         |             |              | are only required at runtime,           |
|                    |                      |             |              | and not at compile time.                |
+--------------------+----------------------+-------------+--------------+-----------------------------------------+
| testImplementation | Test dependencies    |      no     |      no      | This is where you                       |
|                    |                      |             |              | should declare dependencies             |
|                    |                      |             |              | which are used to compile tests.        |
+--------------------+----------------------+-------------+--------------+-----------------------------------------+
| testCompileOnly    | Declaring test       |     yes     |      yes     | This is where you should                |
|                    | compile only         |             |              | declare dependencies                    |
|                    | dependencies         |             |              | which are only required                 |
|                    |                      |             |              | at test compile time,                   |
|                    |                      |             |              | but should not leak into the runtime.   |
|                    |                      |             |              | This typically includes dependencies    |
|                    |                      |             |              | which are shaded when found at runtime. |
+--------------------+----------------------+-------------+--------------+-----------------------------------------+
| testRuntimeOnly    | Declaring test       |      no     |      no      | This is where you should                |
|                    | runtime dependencies |             |              | declare dependencies which              |
|                    |                      |             |              | are only required at test               |
|                    |                      |             |              | runtime, and not at test compile time.  |
+--------------------+----------------------+-------------+--------------+-----------------------------------------+
13
yoAlex5 2020-04-14 00:31.

Gradle 3.0 giới thiệu các thay đổi tiếp theo:

  • compile -> api

    api từ khóa giống như không dùng nữa compile

  • compile -> implementation

    Là cách tốt hơn vì có một số lợi thế. implementationchỉ hiển thị sự phụ thuộc cho một lần lên cấp tại thời điểm xây dựng (phần phụ thuộc có sẵn trong thời gian chạy). Kết quả là bạn có một bản dựng nhanh hơn (không cần phải biên dịch lại người tiêu dùng cao hơn sau đó lên 1 cấp)

  • provided -> compileOnly

    Phần phụ thuộc này chỉ có sẵn trong thời gian biên dịch (phần phụ thuộc không khả dụng trong thời gian chạy). Sự phụ thuộc này không thể là bắc cầu và được .aar. Nó có thể được sử dụng với bộ xử lý chú thích thời gian biên dịch và cho phép bạn giảm tệp đầu ra cuối cùng

  • compile -> annotationProcessor

    Rất giống compileOnlynhưng cũng đảm bảo rằng phụ thuộc bắc cầu không hiển thị cho người tiêu dùng

  • apk -> runtimeOnly

    Sự phụ thuộc không có sẵn trong thời gian biên dịch nhưng có sẵn trong thời gian chạy.

[Loại phụ thuộc POM]

10
Rushabh Agarwal 2018-05-23 17:12.

Sự khác biệt ngắn gọn trong thuật ngữ của giáo dân là:

  • Nếu bạn đang làm việc trên một giao diện hoặc mô-đun cung cấp hỗ trợ cho các mô-đun khác bằng cách hiển thị các thành viên của phụ thuộc đã nêu, bạn nên sử dụng 'api'.
  • Nếu bạn đang tạo một ứng dụng hoặc mô-đun sẽ triển khai hoặc sử dụng phần phụ thuộc đã nêu trong nội bộ, hãy sử dụng 'triển khai'.
  • 'compile' hoạt động tương tự như 'api', tuy nhiên, nếu bạn chỉ triển khai hoặc sử dụng bất kỳ thư viện nào, thì 'implement' sẽ hoạt động tốt hơn và tiết kiệm tài nguyên cho bạn.

đọc câu trả lời của @aldok để biết ví dụ toàn diện.

7
Pom12 2019-12-11 00:14.

Kể từ phiên bản 5.6.3, tài liệu Gradle cung cấp các quy tắc đơn giản để xác định xem compilephụ thuộc cũ (hoặc mới) nên được thay thế bằng implementationhoặc apiphụ thuộc:

  • Ưu tiên implementationcấu hình hơn apikhi có thể

Điều này giúp ngăn chặn sự phụ thuộc của đường dẫn biên dịch của người tiêu dùng. Ngoài ra, người tiêu dùng sẽ ngay lập tức không biên dịch được nếu bất kỳ kiểu triển khai nào vô tình bị rò rỉ vào API công khai.

Vậy bạn nên sử dụng apicấu hình khi nào? Phần phụ thuộc API là phần chứa ít nhất một kiểu được hiển thị trong giao diện nhị phân thư viện, thường được gọi là ABI (Giao diện nhị phân ứng dụng) của nó. Điều này bao gồm, nhưng không giới hạn ở:

  • loại được sử dụng trong siêu lớp hoặc giao diện
  • các kiểu được sử dụng trong các tham số phương thức công khai, bao gồm các kiểu tham số chung (trong đó công khai là thứ hiển thị cho trình biên dịch. Tức là các thành viên riêng tư đóng gói, bảo vệ và công khai trong thế giới Java)
  • các loại được sử dụng trong các trường công cộng
  • các loại chú thích công khai

Ngược lại, bất kỳ kiểu nào được sử dụng trong danh sách sau đây đều không liên quan đến ABI và do đó phải được khai báo là một implementationphụ thuộc:

  • loại được sử dụng riêng trong cơ quan phương pháp
  • loại được sử dụng riêng cho các thành viên riêng
  • các loại chỉ được tìm thấy trong các lớp nội bộ (các phiên bản tương lai của Gradle sẽ cho phép bạn khai báo gói nào thuộc về API công khai)
1
Gauraw Negi 2020-10-13 20:37.
  • thực hiện: chủ yếu chúng tôi sử dụng cấu hình triển khai. Nó ẩn phần phụ thuộc bên trong của mô-đun đối với người tiêu dùng của nó để tránh việc sử dụng ngẫu nhiên bất kỳ phần phụ thuộc bắc cầu nào, do đó biên dịch nhanh hơn và biên dịch lại ít hơn.

  • api: phải được sử dụng rất cẩn thận, vì nó làm rò rỉ classpath biên dịch của người tiêu dùng, do đó việc sử dụng sai api có thể dẫn đến ô nhiễm phụ thuộc.

  • compileOnly: khi chúng ta không cần bất kỳ phụ thuộc nào trong thời gian chạy, vì phụ thuộc compileOnly sẽ không trở thành một phần của bản dựng cuối cùng. chúng tôi sẽ nhận được kích thước xây dựng nhỏ hơn.

  • runtimeOnly: khi chúng ta muốn thay đổi hoặc hoán đổi hành vi của thư viện trong thời gian chạy (trong bản dựng cuối cùng).

Tôi đã tạo một bài đăng với sự hiểu biết sâu sắc về từng cái bằng Ví dụ làm việc: mã nguồn

https://medium.com/@gauraw.negi/how-gradle-dependency-configurations-work-underhood-e934906752e5

Related questions

MORE COOL STUFF

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett đã bất chấp những lời khuyên hẹn hò điển hình khi cô gặp chồng mình.

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Michael Sheen là một diễn viên phi lợi nhuận nhưng chính xác thì điều đó có nghĩa là gì?

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Ngôi sao của Hallmark Colin Egglesfield chia sẻ về những cuộc gặp gỡ với người hâm mộ ly kỳ tại RomaDrama Live! cộng với chương trình INSPIRE của anh ấy tại đại hội.

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Bạn sẽ phải phủi sạch đầu đĩa Blu-ray hoặc DVD để xem tại sao Northern Exposure trở thành một trong những chương trình nổi tiếng nhất của thập niên 90.

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

8 công dụng tuyệt vời của Baking Soda và Giấm

8 công dụng tuyệt vời của Baking Soda và Giấm

Bạn biết đấy, hai sản phẩm này là nguồn điện để làm sạch, riêng chúng. Nhưng cùng với nhau, chúng có một loạt công dụng hoàn toàn khác.

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Thủy điện rất cần thiết cho lưới điện của Hoa Kỳ, nhưng nó chỉ tạo ra năng lượng khi có nước di chuyển. Bao nhiêu nhà máy thủy điện có thể gặp nguy hiểm khi các hồ và sông cạn kiệt?

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Tóc tỉa từ các tiệm và các khoản quyên góp cá nhân có thể được tái sử dụng như những tấm thảm thấm dầu và giúp bảo vệ môi trường.

Xem đoạn giới thiệu cho bộ phim chuyển thể đầy khói lửa, có sự góp mặt của ngôi sao Edward Norton từ phim Motherless Brooklyn của Jonathan Lethem

Xem đoạn giới thiệu cho bộ phim chuyển thể đầy khói lửa, có sự góp mặt của ngôi sao Edward Norton từ phim Motherless Brooklyn của Jonathan Lethem

Edward Norton đã muốn đưa cuốn tiểu thuyết Motherless Brooklyn của Jonathan Lethem's Joycean 1999 lên màn ảnh kể từ khi nó được xuất bản. Bây giờ, 20 năm sau, một đoạn giới thiệu đã xuất hiện cho câu chuyện sôi nổi, đưa câu chuyện của Lethem trở lại những năm 1950 với rất nhiều gương mặt quen thuộc.

Cách dễ dàng chọn không tham gia trọng tài ràng buộc thẻ Apple

Cách dễ dàng chọn không tham gia trọng tài ràng buộc thẻ Apple

Có thích thú khi sử dụng Thẻ Apple mới của bạn không? Trước khi bạn bắt đầu chi tiêu, có một nhiệm vụ bổ sung cần xem xét: chọn không tham gia trọng tài ràng buộc. Bạn sẽ phát hiện ra các điều khoản trọng tài ràng buộc trong nhiều thỏa thuận tài chính vì nó giúp ngăn các ngân hàng và đối tác kinh doanh của họ không phải ra tòa.

Những người chơi Fortnite World Cup không ghi bàn có cảm giác hài hước về điều đó

Những người chơi Fortnite World Cup không ghi bàn có cảm giác hài hước về điều đó

Điểm số tại vòng chung kết Fortnite World Cup Solo hôm nay là rất lớn, với người chiến thắng Bugha ghi được nhiều hơn 26 điểm so với người về thứ hai là Psalm. Nhưng không phải ai cũng có thể giành chiến thắng: Bốn cầu thủ ra về với 0 điểm, nhưng — ít nhất là trên Twitter — họ là những người thể thao tốt về điều đó.

Báo cáo: Cánh cửa tuyển sinh có thể đã mở cho các ứng viên UCLA có mối quan hệ có ảnh hưởng

Báo cáo: Cánh cửa tuyển sinh có thể đã mở cho các ứng viên UCLA có mối quan hệ có ảnh hưởng

Huấn luyện viên trưởng của bộ môn thể dục dụng cụ UCLA Valorie Kondos-Field theo dõi Katelyn Ohashi thi đấu thăng bằng trong trận gặp Stanford tại Pauley Pavilion vào ngày 10 tháng 3 năm 2019 ở Los Angeles, California. Vụ bê bối gian lận tuyển sinh đại học tiết lộ các chi tiết của một quá trình chính thức hóa để đưa những đứa trẻ thất bại của các gia đình giàu có và nổi tiếng vào các trường đại học đáng tin cậy và danh tiếng, sử dụng một "cửa phụ" đắt tiền cho các bậc cha mẹ mà sự giàu có của họ khiến họ không có cơ hội. chỉ cần tài trợ cho một cánh mới trong khuôn viên trường.

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Rothschild's luggage got lost, but luckily she has an incredible closet to shop: Sister Paris Hilton's!

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa. Từ Hollywood đến New York và mọi nơi ở giữa, hãy xem các ngôi sao yêu thích của bạn đang làm gì!

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

Các nhà điều tra đang xem xét liệu nhóm và nghi phạm có biết nhau trước vụ tấn công hay không

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Vụ kiện, nêu tên một số học khu, lập luận rằng dự luật "Không nói đồng tính" được ban hành gần đây của Florida "có hiệu quả im lặng và xóa bỏ học sinh và gia đình LGBTQ +"

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Vào năm 2021, tôi khuyến khích bạn suy nghĩ lại mọi thứ bạn biết về khách hàng mà bạn phục vụ và những câu chuyện bạn kể cho họ. Lùi lại.

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Vào ngày sinh nhật thứ 9 của Felix The Cat, tôi nhớ về một trong những mất mát lớn nhất trong cuộc đời trưởng thành của tôi - Sophie của tôi vào năm 2013. Tôi đã viết bài luận này và chia sẻ nó trên nền tảng này một thời gian ngắn vào năm 2013.

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Tôi ghét từ "tàu đắm". Mọi người cảm thấy thoải mái trong la bàn đạo đức của riêng mình, và khi làm như vậy, họ thấy mình vượt qua sự phán xét.

Tầm nhìn đám mây phi tập trung của DFINITY Blockchain

Lưu ý của người biên tập: Bạn đang xem tài liệu lỗi thời từ blog DFINITY đang được bảo quản cho mục đích lưu trữ.

Tầm nhìn đám mây phi tập trung của DFINITY Blockchain

Bài đăng này khám phá tầm nhìn về đám mây phi tập trung của nhóm DFINITY và cách nó liên quan đến các nhà cung cấp blockchain truyền thống và đám mây hiện có như Amazon Web Services. Các minh chứng về công nghệ DFINITY được áp dụng bởi một mạng lưới quy mô lớn sẽ được thực hiện vào mùa thu năm 2017, sau đó sẽ được gây quỹ Chính cho quỹ hỗ trợ phi lợi nhuận, với mạng “đám mây mở” dự kiến ​​sẽ ra mắt vào đầu mùa hè năm 2018 .

Language