在本文中,我们将详细介绍为什么angularlibrary的build不能将assets静态资源打包进去的各个方面,并为您提供关于转的相关解答,同时,我们也将为您带来关于ALAsset,ALAsset
在本文中,我们将详细介绍为什么angular library的build不能将assets静态资源打包进去的各个方面,并为您提供关于转的相关解答,同时,我们也将为您带来关于ALAsset,ALAssetsLibrary,ALAssetsgroup常见属性及用法、ALAssetsLibrary-代码操作iOS相册资源、ALAssetsLibrary详解、Android Library的依赖方式及发布(转)的有用知识。
本文目录一览:- 为什么angular library的build不能将assets静态资源打包进去(转)(angular静态资源路径)
- ALAsset,ALAssetsLibrary,ALAssetsgroup常见属性及用法
- ALAssetsLibrary-代码操作iOS相册资源
- ALAssetsLibrary详解
- Android Library的依赖方式及发布(转)
为什么angular library的build不能将assets静态资源打包进去(转)(angular静态资源路径)
Versions
Angular CLI: 6.0.7
Node: 9.3.0
OS: darwin x64
Angular: 6.0.3
... animations, common, compiler, compiler-cli, core, forms
... http, language-service, platform-browser
... platform-browser-dynamic, router
Package Version
------------------------------------------------------------
@angular-devkit/architect 0.6.7
@angular-devkit/build-angular 0.6.7
@angular-devkit/build-ng-packagr 0.6.7
@angular-devkit/build-optimizer 0.6.7
@angular-devkit/core 0.6.7
@angular-devkit/schematics 0.6.7
@angular/cdk 6.2.0
@angular/cli 6.0.7
@angular/material 6.2.0
@ngtools/json-schema 1.1.0
@ngtools/webpack 6.0.7
@schematics/angular 0.6.7
@schematics/update 0.6.7
ng-packagr 3.0.0
rxjs 6.2.0
typescript 2.7.2
webpack 4.8.3
Repro steps
- Create a library
@acme/lib1
usingng generate library @acme/lib1
- Create assets folder under
projects/acme/lib1/assets
and add images - Add a
"projects" -> "@acme/lib1" -> "architect" -> "build" -> "options" -> "assets"
key to the library''s config withinangular.json
file. - Build library using
ng build @acme/lib1
- Fail error should show and none of the assets will be copied to
dist
folder.
Observed behavior
Upon building & packaging an Angular 6 library e.g. @acme/lib1
using ng build @acme/lib1
, the Angular CLI does not copy the library''s assets into the dist/acme/lib1/assets
folder. This happens also when using the --prod
flag.
The CLI seems to only support copying the root app''s assets but not library specific assets.
When trying to add "assets": ["src/assets"]
to project @acme/lib1
within angular.json
, the following error appears in the command line:
Schema validation Failed with the following errors: Data path "" should NOT have additional properties(assets).
When creating the following custom rule to copying the files on ng build
:
"assets": [
"src/favicon.ico",
"src/assets",
{ "glob": "**/*", "input": "src/assets", "output": "../acme/lib1/assets/" }
],
I get the following error:
An asset cannot be written to a location outside of the output path.
While it is possible to work around this issue using other command line tools/scripts, it will be more consistent to add support for library''s assets copy as well.
Desired behavior
Use Case
Very often libraries include image files, icons, css files and other static files which are needed to be distrubted with the package.
What would like to see implemented?
Add ability to define a library specific assets
property within angular.json
.
Example -
"@acme/lib1": {
"root": "projects/acme/lib1",
"sourceRoot": "projects/acme/lib1/src",
"projectType": "library",
"prefix": "lib",
"architect": {
"build": {
"builder": "@angular-devkit/build-ng-packagr:build",
"options": {
"tsConfig": "projects/acme/lib1/tsconfig.lib.json",
"project": "projects/acme/lib1r/ng-package.json",
"assets": [ // <--------- this is currently not supported
"src/assets"
]
},
...}
What did you expect to see?
Project''s specific assets should be copied from projects/acme/lib1/src/assets
into dist/acme/lib1/assets
.
Mention any other details that might be useful (optional)
原文地址:https://github.com/angular/angular-cli/issues/11071
总结
以上是小编为你收集整理的为什么angular library的build不能将assets静态资源打包进去(转)全部内容。
如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。
原文地址:https://www.cnblogs.com/princesong/p/10812314.html
ALAsset,ALAssetsLibrary,ALAssetsgroup常见属性及用法
ALAssetsgroup
---------------------------------------------------------------------------
Enumerating Assets(遍历资源)
– enumerateAssetsUsingBlock:(用一个block来遍历组里的资源)
– enumerateAssetsWithOptions:usingBlock:(在枚举选项的条件下,用一个block来遍历组里的资源)
– enumerateAssetsAtIndexes:options:usingBlock:(在枚举选项的条件下,用一个block来遍历组里特定index的资源)
Adding Assets(添加资源)
– addAsset:(添加一个已存在的asset到接收者。返回yes成功;反之,失败。)
editable
property(指示程序是否可以编辑组,只读属性,打印看了一下,系统自带的是不能编辑的,其它可以编辑)
Filtering(过滤)
– numberOfAssets(返回组过滤器条件下的资源个数,若没有设置过滤器,则返回组里的资源个数)
– setAssetsFilter:(设置组的过滤器)
Accessing Properties(访问属性)
– valueForProperty:(通过组属性名称,获取组属性:组名称,组类型,组永久性ID,组URL)
– posterImage(组的封面)
ALAsset
---------------------------------------------------------------------------
Asset Properties
– valueForProperty:
(1.ALAssetPropertyType 资源的类型(照片,视频)
2.ALAssetPropertyLocation 资源地理位置(无位置信息返回null)
3.ALAssetPropertyDuation 播放时长(照片返回ALErorInvalidProperty)
4.ALAssetPropertyOrientation 方向(共有8个方向,参见:ALAssetOrientation)
5.ALAssetPropertyDate 拍摄时间(包含了年与日时分秒)
6.ALAssetPropertyRepresentations 描述(打印看了下,只有带后缀的名称)
7.ALAssetPropertyURLs(返回一个字典,键值分别是文件名和文件的url)
8.ALAssetPropertyAssetURL 文件的url )
editable
property(指示资源是否可以编辑,只读属性)originalAsset
property(原始资源。若没有保存修改后资源,则原始资源为nil)
Accessing Representations
– defaultRepresentation
– representationForUTI:
– thumbnail(小正方形的缩略图)
– aspectRatioThumbnail(按原始资源长宽比例的缩略图)
Setting New Image and Video Data
– setImageData:metadata:completionBlock:
用给定的image data 替换接收者的image data。
– setVideoAtPath:completionBlock:
用给定的URL的video 替换接收者的video data。
Saving to the Saved Photos Album
– writeModifiedImageDataToSavedPhotosAlbum:metadata:completionBlock:
保存image data到Saved Photos album
– writeModifiedVideoAtPathToSavedPhotosAlbum:completionBlock:
保存video到Saved Photos album的指定路径
ALAssetRepresentation
---------------------------------------------------------------------------
ALAssetRepresentation对象封装了一个给定ALAsset对象的陈述。
一个在资源库中给定的asset可能有不止一个陈述。比如,如果一个相机提供RAW和JPEG格式的图像版本,
asset将有两个陈述版本,一个是RAW的,一个是JPEG的。
Getting Image Representations
– CGImageWithOptions:
– fullResolutionImage(完全分辨率的图片)
– fullScreenImage(满屏的图片)
– CGImageWithOptions:
– fullResolutionImage(完全分辨率的图片)
– fullScreenImage(满屏的图片)
Getting Image Attributes
– orientation(文件方向)
– scale(长宽比例)
– filename(文件名字)
– orientation(文件方向)
– scale(长宽比例)
– filename(文件名字)
Getting Raw Data
– size(文件尺寸,以byte为单位)
– getBytes:fromOffset:length:error:
– size(文件尺寸,以byte为单位)
– getBytes:fromOffset:length:error:
Getting Metadata
– UTI
– metadata
– UTI
– metadata
Getting an URL
– url
– url
使用
---------------------------------------------------------------------------
利用ALAssetsLibrary来获取相册的分组:
[plain] view plaincopy
-(void)getGroup
{
@autoreleasepool
{
ALAssetsLibraryAccessFailureBlock failureblock =
^(NSError *myerror)
{
NSLog(@"相册访问失败 =%@", [myerror localizedDescription]);
if ([myerror.localizedDescription rangeOfString:@"Global denied access"].location!=NSNotFound) {
NSLog(@"无法访问相册.请在''设置->定位服务''设置为打开状态.");
}else{
NSLog(@"相册访问失败.");
}
};
ALAssetsLibraryGroupsEnumerationResultsBlock
libraryGroupsEnumeration = ^(ALAssetsGroup* group,BOOL* stop)
{
if (group!=nil)
{
[self.groupArray addObject:group];
}
else
{
if (!_groupTable)
{
_groupTable = [[UITableView alloc] initWithFrame:EZRECT(0, 0, SCREEN_SIZE_WIDTH, SCREEN_SIZE_HEIGHT - 44)
style:UITableViewStylePlain];
_groupTable.delegate = self;
_groupTable.dataSource = self;
[self.view addSubview:_groupTable];
}
[_groupTable performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
}
};
[[DataCenter defaultAssetsLibrary] enumerateGroupsWithTypes:ALAssetsGroupAll
usingBlock:libraryGroupsEnumeration
failureBlock:failureblock];
}
}
由于分组在添加到groupArray中,后面要在外面的函数中调用,这样会发生警告,所以,将ALAssetsLibrary的获取写成一个单例
[plain] view plaincopy
+ (ALAssetsLibrary *)defaultAssetsLibrary
{
static dispatch_once_t pred = 0;
static ALAssetsLibrary *library = nil;
dispatch_once(&pred,
^{
library = [[ALAssetsLibrary alloc] init];
});
return library;
}
利用获得的分组再来获取资源文件:
[plain] view plaincopy
-(void)filterImageWithGroup:(ALAssetsGroup *)group
{
[self.images removeAllObjects];
ALAssetsGroupEnumerationResultsBlock groupEnumerAtion =
^(ALAsset *result,NSUInteger index, BOOL *stop)
{
if (result!=NULL)
{
if ([[result valueForProperty:ALAssetPropertyType]isEqualToString:ALAssetTypePhoto])
{
[self.images addObject:result];
}
}
else
{
//主线程中刷新UI
}
};
[group enumerateAssetsUsingBlock:groupEnumerAtion];
}
ALAssetsLibrary-代码操作iOS相册资源
在iOS中,我们调用摄像头和选择相册中的资源,我们可以使用:UIImagePickerController类来完成。
当然,我们也可以不使用UI的形式来访问iOS设备的相册资源。
那就是使用:ALAssetsLibrary
一、ALAssetsLibrary是什么
可以说,是一个桥梁把。连接了我们应用程序和相册之间的访问。
ALAssetsLibrary提供了我们对iOS设备中的相片、视频的访问。
ALAssetsLibrary被封装在 框架中。所以,我们在使用时,需要引入该框架。
贴:
self.view.backgroundColor = [UIColor whiteColor];
self.assetsLibrary = [[ALAssetsLibrary alloc] init];
dispatch_queue_t dispatchQueue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(dispatchQueue, ^(void) {
// 遍历所有相册
[self.assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll
usingBlock:^(ALAssetsGroup *group, BOOL*stop) {
// 遍历每个相册中的项ALAsset
[group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index,BOOL *stop) {
__block BOOL foundThePhoto =NO;
if (foundThePhoto){
*stop = YES;
}
// ALAsset的类型
NSString *assetType = [resultvalueForProperty:ALAssetPropertyType];
if ([assetTypeisEqualToString:ALAssetTypePhoto]){
foundThePhoto = YES;
*stop = YES;
ALAssetRepresentation*assetRepresentation =[result defaultRepresentation];
CGFloat imageScale = [assetRepresentation scale];
UIImageOrientationimageOrientation = (UIImageOrientation)[assetRepresentation orientation];
dispatch_async(dispatch_get_main_queue(), ^(void) {
CGImageRefimageReference = [assetRepresentation fullResolutionImage];
// 对找到的图片进行操作
UIImage *image =[[UIImage alloc] initWithCGImage:imageReference scale:imageScaleorientation:imageOrientation];
if (image != nil){
self.imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];
self.imageView.contentMode = UIViewContentModeScaleAspectFit;
self.imageView.image = image;
[self.viewaddSubview:self.imageView];
} else {
NSLog(@"Failed to create the image.");
} });
}
}];
}
failureBlock:^(NSError *error) {
NSLog(@"Failed to enumerate the asset groups.");
}];
});
乱啊,没办法,在xCode中是OK的。
需要解释的几点:
1.流程:该代码的流程,就是先遍历所有相册,然后,遍历每个相册中的第一张图片。
2.ALAssetsGroup:指代一个相册。
3.ALAsset:每一个ALAsset代表一个单一资源文件(也就是一张图片,或者一个视频文件)
4.ALAssetRepresentation:ALAssetRepresentation封装了ALAsset,包含了一个资源文件中的很多属性。(可以说是ALAsset的不同的表示方式,本质上都表示同一个资源文件)
ALAssetsLibrary详解
ALAssetsLibrary类是代表系统中整个资源库,使用它可以访问资源库中的资源和保存照片,视频等功能。
_library = [[ALAssetsLibrary alloc]init];
//判断当前应用是否能访问相册资源
/*
typedef NS_ENUM(NSInteger, ALAuthorizationStatus) {
ALAuthorizationStatusNotDetermined = 0, 用户尚未做出了选择这个应用程序的问候
ALAuthorizationStatusRestricted, 此应用程序没有被授权访问的照片数据。可能是家长控制权限。
ALAuthorizationStatusDenied, 用户已经明确否认了这一照片数据的应用程序访问.
ALAuthorizationStatusAuthorized 用户已授权应用访问照片数据.
}
*/
int author = [ALAssetsLibrary authorizationStatus];
NSLog(@"author type:%d",author);
//关闭监听共享照片流产生的频繁通知信息
[ALAssetsLibrary disableSharedPhotoStreamsSupport];
//创建一个相册到相册资源中,并通过block返回创建成功的相册ALAssetsGroup
[_library addAssetsGroupAlbumWithName:@"test" resultBlock:^(ALAssetsGroup *group) {
//NSString *const ALAssetsGroupPropertyName;
//NSString *const ALAssetsGroupPropertyType;
//NSString *const ALAssetsGroupPropertyPersistentID;
//NSString *const ALAssetsGroupPropertyURL;
//查看相册的名字
NSLog(@"ALAssetsGroupPropertyName:%@",[group valueForProperty:ALAssetsGroupPropertyName]);
//查看相册的类型
NSLog(@"ALAssetsGroupPropertyType:%@",[group valueForProperty:ALAssetsGroupPropertyType]);
//查看相册的存储id
NSLog(@"ALAssetsGroupPropertyPersistentID:%@",[group valueForProperty:ALAssetsGroupPropertyPersistentID]);
//查看相册存储的位置地址
NSLog(@"ALAssetsGroupPropertyURL:%@",[group valueForProperty:ALAssetsGroupPropertyURL]);
groupURL = [group valueForProperty:ALAssetsGroupPropertyURL];
} failureBlock:^(NSError *error) {
}];
新添加了一个名为test的相册
[NSThread sleepForTimeInterval:0.5];
//通过url地址在相册资源中获取该地址的资源文件ALAsset,有可能是相片或视频
[_library assetForURL:[NSURL URLWithString:@""] resultBlock:^(ALAsset *asset) {
/*
NSString *const ALAssetPropertyType;
NSString *const ALAssetPropertyLocation;
NSString *const ALAssetPropertyDuration;
NSString *const ALAssetPropertyOrientation;
NSString *const ALAssetPropertyDate;
NSString *const ALAssetPropertyRepresentations;
NSString *const ALAssetPropertyURLs;
NSString *const ALAssetPropertyAssetURL;
*/
//查看资源的地理位置信息
NSLog(@"ALAssetPropertyLocation:%@",[asset valueForProperty:ALAssetPropertyLocation]);
//如果资源是视频,查看视频的时长
NSLog(@"ALAssetPropertyDuration:%@",[asset valueForProperty:ALAssetPropertyDuration]);
//查看资源的方向,图片的旋转方向
NSLog(@"ALAssetPropertyOrientation:%@",[asset valueForProperty:ALAssetPropertyOrientation]);
//查看资源的创建时间
NSLog(@"ALAssetPropertyDate:%@",[asset valueForProperty:ALAssetPropertyDate]);
//查看资源的描述信息
NSLog(@"ALAssetPropertyRepresentations:%@",[asset valueForProperty:ALAssetPropertyRepresentations]);
NSLog(@"ALAssetPropertyURLs:%@",[asset valueForProperty:ALAssetPropertyURLs]);
//查看资源的url路径
NSLog(@"ALAssetPropertyAssetURL:%@",[asset valueForProperty:ALAssetPropertyAssetURL]);
} failureBlock:^(NSError *error) {
}];
//通过url地址获取相册资源中的一个相册
[_library groupForURL:groupURL resultBlock:^(ALAssetsGroup *group) {
NSLog(@"ALAssetsGroupPropertyName:%@",[group valueForProperty:ALAssetsGroupPropertyName]);
} failureBlock:^(NSError *error) {
}];
//根据选择的类型遍历相册资源中的相对应类型的所有相册,其中stop行参是指针,表示是否停止迭代,当赋值为false则停止
/*
enum {
ALAssetsGroupLibrary = (1 << 0),
ALAssetsGroupAlbum = (1 << 1),
ALAssetsGroupEvent = (1 << 2),
ALAssetsGroupFaces = (1 << 3),
ALAssetsGroupSavedPhotos = (1 << 4),
ALAssetsGroupPhotoStream = (1 << 5),
ALAssetsGroupAll = 0xFFFFFFFF,
};
*/
[_library enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
NSLog(@"group name:%@",[group valueForProperty:ALAssetsGroupPropertyName]);
} failureBlock:^(NSError *error) {
}];
//保存图片到系统默认的相册中,使用nsdata的形式,并返回照片的url地址
[_library writeImageDataToSavedPhotosAlbum:nil metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) {
}];
//保存图片到系统默认的相册中,使用cgimageref的形式,并返回照片的url地址
[_library writeImageToSavedPhotosAlbum:nil metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) {
}];
//保存图片到系统默认的相册中,使用cgimageref的形式,并且选择图片以什么旋转方向的形式保存,并返回照片的url地址
/*
typedef enum {
ALAssetOrientationUp, // default orientation
ALAssetOrientationDown, // 180 deg rotation
ALAssetOrientationLeft, // 90 deg CCW
ALAssetOrientationRight, // 90 deg CW
ALAssetOrientationUpMirrored, // as above but image mirrored along other axis. horizontal flip
ALAssetOrientationDownMirrored, // horizontal flip
ALAssetOrientationLeftMirrored, // vertical flip
ALAssetOrientationRightMirrored, // vertical flip
} ALAssetOrientation;
*/
UIImage* image = [UIImage imageNamed:@"test.png"];
[_library writeImageToSavedPhotosAlbum:[image CGImage] orientation:ALAssetOrientationLeft completionBlock:^(NSURL *assetURL, NSError *error) {
NSLog(@"save image:%@",assetURL);
}];
Android Library的依赖方式及发布(转)
还是那句老话,好记性不然烂笔头,在此整理 Android Studio 依赖相关 以及 如何发布项目到 JCenter
Android Studio 添加依赖
Module 依赖
module 依赖是指在本地创建一个 module,然后如下步骤,依赖此模块。
这样做的好处就是随时可以修改 module。
上图可以看到,Android Studio(以下简称 AS)提供了三种依赖方式。
本地依赖
本地依赖是指,将 jar 或者 aar 直接拷贝到项目的 libs 文件夹下 ,然后对其进行依赖。
jar 的依赖如图一,拷贝进 libs 目录后,AS 才能识别到。
aar 的本地依赖官方没有提供解决方案,不过高手在民间。
在讲解本地 aar 依赖之前,先科普一下 aar 文件。
aar 文件是基于 jar 文件之上开发的。因为有些Android Library 需要植入一些安卓特有的文件,比如 AndroidManifest.xml,资源文件,Assets或者JNI。这些文件在 Jar 中是没有的,因此诞生了 aar 文件。
aar 文件和 jar 一样,只是普通的zip文件。不过具有不同的文件结构。jar文件以classes.jar的名字被嵌入到aar文件中。
aar文件如下:
/AndroidManifest.xml (mandatory)
/classes.jar (mandatory)
/res/ (mandatory)
/R.txt (mandatory)
/assets/ (optional)
/libs/*.jar (optional)
/jni//*.so (optional)
/proguard.txt (optional)
/lint.jar (optional)
在此说明一下,aar 文件的生成只能在 Android Library 中,也就是gradle脚本的声明是apply plugin: ''com.android.library''的 module,然后编译后就会在 build/outputs/aar 文件夹里生成aar文件。
本地 aar 依赖需要在 app 的 build.gradle 文件添加如下内容
repositories {
flatDir {
dirs ''libs'' //this way we can find the .aar file in libs folder
}
}
之后再其它项目里面添加 gradle 依赖
dependencies {
compile(name:''dor'', ext:''aar'')
}
以上就是 aar 的本地依赖。
远程依赖
远程依赖就是在 app 的 build.gradle 中直接添加(当然也可以通过图一搜索的方式)
dependencies {
compile ''com.squareup.picasso:picasso:2.5.2''
}
这样一行代码就完成了依赖,也是最常见的依赖方式。
远程依赖库的来源
我刚开始也不明白AS 是怎样凭借 一行代码得到这些library的。
查阅资料才知道,AS 是从项目 build.gradle 文件里面定义的Maven 仓库服务器上下载library的。
Apache Maven 是 Apache 开发的一个工具,提供了用于贡献library的文件服务器。
总的来说,只有两个标准的 Android library 文件服务器:JCenter 和 Maven Central。
不管是 「JCenter」还是「Maven Central」 ,两者都是Maven 仓库,只是他们维护的服务器不同,由不同的人提供。
JCenter
JCenter 是一个由 bintray.com 维护的Maven仓库 ,整个仓库的内容在 http://jcenter.bintray.com/
在项目的build.gradle 文件中如下定义仓库,就能使用jcenter了
allprojects {
repositories {
jcenter()
}
}
Maven Centra
Maven Central 则是由 sonatype.org 维护的Maven仓库,整个仓库的内容在 https://oss.sonatype.org/content/repositories/releases/
在项目的build.gradle 文件中如下定义仓库,就能使用Maven Central了
allprojects {
repositories {
mavenCentral()
}
}
jcenter 与 Maven Central 的区别
事实上两个仓库都具有相同的使命:提供Java或者Android library服务。上传到哪个(或者都上传)取决于开发者。
起初,Android Studio 选择Maven Central作为默认仓库。如果你使用老版本的Android Studio创建一个新项目,mavenCentral()会自动的定义在build.gradle中。
但是Maven Central的最大问题是对开发者不够友好。上传library异常困难。上传上去的开发者都是某种程度的极客。同时还因为诸如安全方面的其他原因,Android Studio团队决定把默认的仓库替换成jcenter。正如你看到的,一旦使用最新版本的Android Studio创建一个项目,jcenter()自动被定义,而不是mavenCentral()。
以下是使用Jcenter的原因:
jcenter通过 CDN 发送library,开发者可以享受到更快的下载体验。
jcenter是全世界最大的Java仓库,因此在Maven Central 上有的,在jcenter上也极有可能有。
上传library到仓库很简单,不需要像在 Maven Central上做很多复杂的事情。
友好的用户界面
如果你想把library上传到 Maven Central ,你可以在bintray网站上直接点击一个按钮就能实现
基于上述原因,我们发布 Android Library 最好是发布到 Jcenter 上。
Gradle 下载依赖库的原理
在项目的 build.gradle 文件中加入一行代码的时候,这些库是怎样下载到我们的项目中呢?
一般来说,library 的字符串形式,包含3部分
GROUP_ID:ARTIFACT_ID:VERSION
以冒号「:」为分隔
GROUP_ID
library的group,通常以开发者包名 加 library的名称来命名group。
ARTIFACT_ID
library的真实名称
VERSION
library 的版本号
例如Android 界大名鼎鼎的 Square 公司的 Library
dependencies {
compile ''com.squareup:otto:1.3.7''
compile ''com.squareup.picasso:picasso:2.5.2''
compile ''com.squareup.okhttp:okhttp:2.4.0''
compile ''com.squareup.retrofit:retrofit:1.9.0''
}
添加上述的依赖库后,Gradle 会根据项目的build.gradle 文件中配置的Maven 仓库,询问仓库服务器这个library是否存在,(如果配置了多个仓库,会依次询问这些仓库)如果存在,Gradle 会获得 library 的存储路径,然后 AS 将下载这些文件到我们的电脑上,与我们的项目一起编译。
一般存储路径都是这样的形式:GROUP_ID/ARTIFACT_ID/VERSION_ID。
例如:
Jcenter库的地址:http://jcenter.bintray.com/com/squareup/otto/1.3.7
Maven Central 库的地址:https://oss.sonatype.org/content/repositories/releases/com/squareup/otto/1.3.7/
上传 Library 到 JCenter
我们总是用别人的库,如果自己写一个库分享给别人用,那样不是更酷嘛!
我们可以通过 Gradle 把项目发布到 Maven 库中,至于选 Maven Central 还是 JCenter,通过前面的介绍,当然是选 JCenter 更好。
整个发布过程如下图:
可以看到整个过程还是挺清晰的,但不亲自去试试,就不知道有多少坑!
1.注册 Bintray 并创建私有 Maven 仓库
JCenter 是由 Bintray 维护的 Maven 库,所有首先得去 Bintray 网站注册一个账号。
就是因为注册这一步有个巨坑,害得自己填了好久。
打开 Bintray官网 ,天真的我就直接点了 START YOUR FREE TRIAL ,然后欲哭无泪。
Bintray 官网在2016年底改版了,直接点注册是组织用户,而非个人用户,这将导致最后一直提交失败。
最后只能重新注册新的个人账户。
个人账户注册在首页的底部,要把页面拉下去才看得到。
或者直接点击这个 注册个人账户
后边注册的步骤就很简单了,有 github或者 google 账户的直接登录就行了,如果需要注册这里的邮箱不能是国内的邮箱。
登录上之后,点击右上角的小箭头 Edit Profile —> API Key —> 输入密码 —> 复制 API Key。
这个 API Key 在后面会有用到。
然后创建私有的 Maven 仓库,在个人首页点击 Add New Repository
然后按照下图填写内容
最后点击 Create 创建,这样就创建了仓库。
2. 配置项目
接下来就是配置要发布的项目。
首先是在项目的根目录 build.gradle 中配置如下:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath ''com.android.tools.build:gradle:2.3.0''
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
//首先添加这两个路径
classpath ''com.github.dcendents:android-maven-gradle-plugin:1.5''
classpath ''com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7''
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
//添加下面的配置以便在 module 中引用
ext {
bintrayRepo = ''maven'' //仓库名
publishedGroupId = ''com.deemons.dor'' //引用时 第一部分
libraryDescription = ''android network''//描述
siteUrl = ''https://github.com/Deemonser/Download''//项目地址
gitUrl = ''https://github.com/Deemonser/Download.git''//gitUrl
developerId = ''deemons''//注册的用户名
developerName = ''deemonser''//开发者名称
developerEmail = ''deemonser@hotmail.com''//开发者邮箱
licenseName = ''The Apache Software License, Version 2.0''
licenseUrl = ''http://www.apache.org/licenses/LICENSE-2.0.txt''
allLicenses = ["Apache-2.0"]
}
//开源库中有中文注释,添加下面这些
allprojects {
tasks.withType(Javadoc) {
options {
encoding "UTF-8"
charSet ''UTF-8''
links "http://docs.oracle.com/javase/7/docs/api"
}
}
}
然后在将要发布的 module 下的 build.gradle 中添加如下配置
//for upload
ext {
publishedGroupId = rootProject.publishedGroupId //引用时的第一部分
artifact = ''dor''//引用时的第二部分
libraryVersion = ''0.1.0''//引用时的第三部分
libraryName = ''dor''//本module名称
bintrayName = ''dor''//Jcenter 上显示的项目名
bintrayRepo = rootProject.bintrayRepo
libraryDescription = rootProject.libraryDescription
siteUrl =rootProject.siteUrl
gitUrl = rootProject.gitUrl
developerId = rootProject.developerId
developerName =rootProject.developerName
developerEmail = rootProject.developerEmail
licenseName = rootProject.licenseName
licenseUrl = rootProject.licenseUrl
allLicenses = rootProject.allLicenses
}
apply from: ''https://raw.githubusercontent.com/nuuneoi/JCenter/master/installv1.gradle''
apply from: ''https://raw.githubusercontent.com/nuuneoi/JCenter/master/bintrayv1.gradle''
最后,在项目的 local.properties 文件中添加如下配置
bintray.user=YOUR_BINTRAY_USERNAME //填写注册的用户名
bintray.apikey=YOUR_BINTRAY_API_KEY //填写前面获取的 API Key
完成上面三个地方的配置后,就可以通过命令上传项目到 Bintray 。
3.提交项目到 Bintray
分别执行下面两个命令
./gradlew install
./gradlew bintrayUpload
如果两次都没报错,并且看到BUILD SUCCESS,就表示上传成功了。
这时候在自己的 Bintray 上,点击前面创建的 maven 仓库。
可以看到发布上来的 library 了
4.将 Bintray 的项目发布到 JCenter
点击刚刚上传的项目,看到下面的详细信息。
这时候,点击右下角的 Add to JCenter 按钮后,跳转到一个提交页面。
然后什么也不做,直接点击Send。
然后就是漫长的等待Bintrary 的审核,如果请求审核通过,会收到一封邮件。
最后就是测试 一行代码 依赖。
如果成功了,那就大功告成啦~
---------------------
作者:Deemons
来源:CSDN
原文:https://blog.csdn.net/Deemons/article/details/77588327?utm_source=copy
版权声明:本文为博主原创文章,转载请附上博文链接!
关于为什么angular library的build不能将assets静态资源打包进去和转的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于ALAsset,ALAssetsLibrary,ALAssetsgroup常见属性及用法、ALAssetsLibrary-代码操作iOS相册资源、ALAssetsLibrary详解、Android Library的依赖方式及发布(转)等相关知识的信息别忘了在本站进行查找喔。
本文标签: