Bower在文件结构中安装不同的相同包 [英] Bower installs same package different in file structure

查看:143
本文介绍了Bower在文件结构中安装不同的相同包的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们有一个TeamCity构建服务器在三个不同的构建器上运行,具有相同的配置。我们已经使用yeoman建立了一个角度/咕噜项目



更新6



增加了一个凉亭问题
https://github.com/bower/bower/issues/1709



bower有时会安装如下的角度动画:

  bower_components / angular-animate / bower-angular-animate-1.3.13 / angular-animate.js 

,有时它将bower-angular-animate-1.3.13的内容放在根中,所以结构如下所示:

  bower_components / angular-animate / angular-animate.js 

那些使我们的测试当然失败了。

任何人都有线索?它总是与获取额外目录的软件包相同。而且在本地它总是有效。



更新:



好像我们运行bower时找不到包bower.json中的主要js文件,看起来可能是问题。但我不知道如何解决它。

更新2:

看起来像鲍尔没有找到主要例如:

  [09:27:40] bower angular-animate#1.3.13 invalid- meta-angular-animate缺少bower.json中的main条目
[09:27:40] bower angular-animate#1.3.13 invalid-meta angular-animate缺少bower.json中的ignore条目

那么在寻找主体时会有什么不同呢?



更新3:



如果我明白它正确.bower.json文件是在下载并提取归档文件后由鲍尔创建的。现在我已经注意到.bower.json文件存在差异。在生成的.bower.json文件中,main和ignore缺失。

这个包失败了:

  [pejn @ bx0023 1.3.13] $ more .bower.json 
{
name:angular-animate,
homepage:https:// github.com/angular/bower-angular-animate,
version:1.3.13,
_release:1.3.13,
_resolution:{
type:version,
tag:v1.3.13,
commit:f18cb98590471ad9c1e5ae0e57178e9ecb8d384c
},
_source :https://github.com/angular/bower-angular-animate.git,
_target:1.3.13
}



这个工程:

  [pejn @ bx0023 1.3.13] $ more .bower.json 
{
name:angular-animate,
version:1.3.13,
main :./angular-animate.js,
ignore:[],
dependencies:{
angular:1.3.13
},
主页:https://github.com/angular/bo wer-angular-animate,
_release:1.3.13,
_resolution:{
type:version,
tag: v1.3.13,
commit:f18cb98590471ad9c1e5ae0e57178e9ecb8d384c
},
_source:https://github.com/angular/bower-angular-animate.git ,
_target:1.3.13
}

Update 4:



添加我的bower.json

  {
name:App,
version:0.0.1,
dependencies:{
angular:1.3.13 ,
json3:3.3.0,
es5-shim:4.0.0,
bootstrap:3.2.0,
angular-animate:1.3.13,
angular-cookies:1.3.13,
angular-resource:1.3.13,
angular -route:1.3.13,
angular-sanitize:1.3.13,
angular-touch:1.3.13,
angular-cache :3.2.5,
modernizr:2.8.3,
jquery:2.1.3,
jquery-ui:1.11 .3,
angular-bootstrap:0.12.0,
angular-local-storage:0.1.5,
highstock-release:2.0 .4,
moment:2.9.0,
moment-timezone:0.3.0,
angular-ui-sortable:0.13.3 ,
angular-ui-utils:bower-unique
},
devDependencies:{
angular-mocks:1.3.13,
angular-scenario:1.3.13
},
appPath:app,
resolution:{
angular: 1.3.13
}
}

更新5



我在buildserver上运行了bower的测试,并且我可以看到它看起来像我有代理/权限问题。看起来我们得到了403.我在下面的boer测试中包含了部分输出:

  [18:27:57] [0m 1]如果缓存标头没有改变,UrlResolver .hasNew应该解析为false:
[18:27:57] [0m [31m Uncaught Error:expected true to equal false [0m [90m
...
[18:27:57] [0m 2)如果服务器响应304(ETag机制),则UrlResolver .hasNew应该解析为真:
[18:27:57] [0m [31m Uncaught Error:expected to equal equal false [0m [90m
...
[18:27:57] [0m 3] UrlResolver .hasNew应该使用重定向:
[18:27 :57] [0m [31m Uncaught Error:expected true to equal false [0m [90m
...
[18:27:57] [0m 4] UrlResolver .resolve应该下载文件,重命名它to index:
[18:27:57] [0m [31m Uncaught Error:状态码为403 [0m [90m
...
[18:27:57] [0m 5 )UrlResolver .resolve应该在源文件存档时解压:
[18:27:57] [0m [31m未捕获错误:状态码为403 [0m [90m
...
[18:27:57] [0m 6)UrlResolver .resolve应该在源文件是一个压缩文件时解压缩(不区分大小写):
[18:27:57]
[ [0m] [31m Uncaught Error:状态代码403 [0m [90m
...
[18:27:57] [0m 7] UrlResolver .resolve应该复制提取的文件夹内容如果存档只包含一个文件夹里面:
[18:27:57] [0m [31m未捕获错误:状态码为403 [0m [90m
...
[18:27 :57] [0m 8)如果source是一个档案文件,UrlResolver .resolve应该提取,如果它只有一个文件在内部,则重命名为index:
[18:27:57] [0m [31m Uncaught Error:Status code of 403 [0m [90m
[18:27:57] at createError(/mnt/ext4/builduser7/build-agent-work-dir/1f8c068934a7bbe0/node_modules/bower/lib/util/createError.js:4:15) )
[18:27:57]请求。< anonymous> (/mnt/ext4/builduser7/build-agent-work-dir/1f8c068934a7bbe0/node_modules/bower/lib/util/download.js:45:40)
[18:27:57]在Request.emit( events.js:117:20)
[18:27:57] [33m警告:任务simplemocha:full失败。使用--force继续。 [39m
[18:27:57] at Request.onResponse(/mnt/ext4/builduser7/build-agent-work-dir/1f8c068934a7bbe0/node_modules/bower/node_modules/request/request.js:1085:10 )
...
[18:27:57] [0m 9)如果source是一个档案文件,UrlResolver .resolve应该解压缩,如果它只是一个bower.json /组件,它就不会重命名为index。 json文件:
[18:27:57] [0m [31m未捕获错误:状态码为403 [0m [90m
....
[18:27:57] UrlResolver.resolve应该在单个文件夹中重命名单个文件,以便在源文件存档时进行索引:
[18:27:57] [0m [31m未捕获错误:状态码为403 [0m [90m
....
[18:27:57] [0m 11)如果响应content-type是一个存档,UrlResolver.resolve应该提取:
[18:27:57] [0m [ 31m未捕获错误:状态码为403 [0m [90m
....
[18:27:57] [0m 12)如果响应内容处理文件名为归档文件,UrlResolver.resolve应该提取:
[18:27:57] [0m [31m未捕获错误:状态代码为403 [0m [90m
...
[18:27:57] [0m 13)如果存在电子标签,则UrlResolver.resolve应该保存发布:
[18: [0m [31m] [0m [31m Uncaught Error:Status code of 403 [0m [90m
...
[18:27:57] [0m 14] UrlResolver .resolve应该允许查询字符串在URL:
[18:27:57] [0m [31m未捕获错误:状态代码为403 [0m [90m
...
[18:27:57] [0m 15] UrlResolver .resolve应该保存缓存标题:
[18:27:57] [0m [31m未捕获错误:状态代码为403 [0m [90m
....
[18:27 :57] [0m 16)UrlResolver .resolve应该与重定向一起工作:
[18:27:57] [0m [31m未捕获错误:状态码为403 [0m [90m
....
[18:27:57] [0m 17] UrlResolver .resolve内容处置验证应该使用和不使用引号:
[18:27:57] [0m [31m未捕获错误:状态代码403 [0m [90m
...
[18:27:57] [0m 18] UrlResolver .resolve内容处置验证不应与部分引号一起使用:
[ [0m [31m] [0m [31m Uncaught Error:状态码为403 [0m [90m
...
[18:27:57] [0m 19] UrlResolver .resolve content-disposition validation如果文件名包含除字母数字,破折号,空格和点以外的字符,则不应工作:
[18:27:57] [0m [31m未捕获错误:状态代码为403 [0m [90m
.. 。
[18:27:57] [0m 20] UrlResolver .resolve content-disposition validation应修剪前后空格:
[18:27:57] [0m [31m未捕获错误:状态码403 [0m [90m
...
[18:27:57] [0m 21)如果文件名以点结尾:UrlResolver.resolve content-disposition验证应该不起作用:
[18:27:57] [0m [31m Uncaught Error:状态代码403 [0m [90m
...
[18:27:57] [0m 22] UrlResolver .resolve content-disposition验证应该不区分大小写:
[18:27:57] [0m [31m未捕获错误:状态码为403 [0m [90m
...
[18:27:57] GitResolver ._cleanup应该删除.git文件从临时目录获得:
[18:27:57] [0m [31m未捕获错误:ENOENT,lstat'/ mnt / ext4 / builduser7 / build-agent-work-dir / 1f8c068934a7bbe0 / node_modules / bower /。 git'[0m [90m
...
[18:27:57] [0m 24)如果解析是分支,GitFsResolver.resolve应该正确地检出:
[18:27:57 ] [0m [31m Uncaught Error:Tag / branch some-branch does not exist [0m [90m
...
[18:27:57] [0m 25)GitFsResolver .resolve应该保留原始的存储库未触及:
[18:27:57] [0m [31m未捕获错误:标记/分支某分支不存在[0m [90m
...
[18:27: 57] [0m 26)GitFsResolver .resolve应该复制源文件夹的权限:
[18:27:57] [0m [31m Uncaught Error:Tag / branch some-branch does not exist [0m [90m
...
[18:27:57] [0m 27)GitFsResolver #refs应该解析为本地存储库的引用:
[18:27:57]
[18:27 :57] [31mUaught错误:预计['0a7daf646d4fd743b6ef701d63bdbe20eee422de refs / ta gs / 0.0.1',
...
[18:27:57] [0m 28)GitFsResolver #refs应该缓存结果:
[18:27:57]
[18:27:57] [31mUncaught错误:预计['0a7daf646d4fd743b6ef701d63bdbe20eee422de refs / tags / 0.0.1',
...
[18:27:57] [0m 29)GitRemoteResolver。如果解析是一个分支,解析应该正确地检出:
[18:27:57] [0m [31m未捕获错误:标记/分支某分支不存在[0m [90m
....
[18:27:57] [0m 30)GitRemoteResolver #refs应该解析为远程仓库的引用:
[18:27:57]
[18:27:57] [ 31mUncaught错误:预计['0a7daf646d4fd743b6ef701d63bdbe20eee422de refs / tags / 0.0.1',
...
[18:27:57] [0m 31)GitRemoteResolver #refs应该缓存结果:
[18:27:57]
[18:27:57] [31mUaught错误:预计['0a7daf646d4fd743b6ef701d63bdbe20eee422de refs / tags / 0.0.1',
...
[18:27 :57] [0m 32)GitHub.constructor应该确保.git在源代码中:
[18:27: 57] [0m [31m错误:预计'https://github.com/twitter/bower.git'等于'git://github.com/twitter/bower.git'[0m [90m
。 ..
[18:27:57] [0m 33)resolverFactory应该正确识别git远程端点:$ b​​ $ b [18:27:57] [0m [31m未捕获错误:预计'https:// github .com / bower / bower.git'等于'git://github.com/bower/bower.git'[0m [90m
...
[18:27:57] [0m 34)resolverFactory应该正确识别GitHub端点:$ b​​ $ b [18:27:57] [0m [31m未捕获错误:期望'https://github.com/user/project.git'等于'git:// github.com/user/project.git'[0m [90m
...
[18:27:57] [0m 35)resolverFactory应该正确识别注册表端点:$ b​​ $ b [18: 27:57] [0m [31m未捕获错误:预计'https://github.com/IndigoUnited/dejavu.git'等于'git://github.com/IndigoUnited/dejavu.git'[0m [90m
...
[18:27:57] [0m 36)resolverFactory应该使用配置的速记解析器:
[18:27:57] [0m [31米未捕获错误:预计'https://github.com/bower/bower.git'等于'git://github.com/bower/bower.git'[0m [ 90m


解决方案

我们遇到了同样的问题,使用在nfs存储上的bower使用的tmp目录。验证您的tmp目录(由.bowerrc中的tmp或env var TMP_DIR指定)不在nfs挂载的存储上。


We have a TeamCity build server running on three different buildusers with the same configuration. We have set up a angular/grunt project using yeoman

Update 6

Added a bower issue https://github.com/bower/bower/issues/1709

How come bower sometimes installs for example angular-animate with the structure:

bower_components/angular-animate/bower-angular-animate-1.3.13/angular-animate.js

and sometimes it puts the content of the bower-angular-animate-1.3.13 in the root so the structure looks like this:

bower_components/angular-animate/angular-animate.js

The first ones makes our test fails of course..

Anyone have a clue? It's always the same packages which get the extra directory. And locally it always works.

Update:

Seems like when we run bower it doesn't find the main js file in the packages bower.json and it looks like that could be the issue. But I don't know how to fix it.

Update 2:

It looks like bower doesn't find the main key in the bower.json for example:

[09:27:40]bower angular-animate#1.3.13          invalid-meta angular-animate is missing "main" entry in bower.json
[09:27:40]bower angular-animate#1.3.13          invalid-meta angular-animate is missing "ignore" entry in bower.json

So what could cause the difference in finding the main?

Update 3:

If I understand it correct the .bower.json file is created by bower after downloading and extracting the archive. Now I have notice that there are differences in the .bower.json file. In the generated .bower.json file the main and ignore is missing. And also the archive is extracted different as mentioned above.

This package fails:

[pejn@bx0023 1.3.13]$ more .bower.json
{
    "name": "angular-animate",
    "homepage": "https://github.com/angular/bower-angular-animate",
    "version": "1.3.13",
    "_release": "1.3.13",
    "_resolution": {
        "type": "version",
        "tag": "v1.3.13",
        "commit": "f18cb98590471ad9c1e5ae0e57178e9ecb8d384c"
    },
    "_source": "https://github.com/angular/bower-angular-animate.git",
"_target": "1.3.13"
}

And this works:

[pejn@bx0023 1.3.13]$ more .bower.json
{
    "name": "angular-animate",
    "version": "1.3.13",
    "main": "./angular-animate.js",
    "ignore": [],
    "dependencies": {
            "angular": "1.3.13"
    },
    "homepage": "https://github.com/angular/bower-angular-animate",
    "_release": "1.3.13",
    "_resolution": {
        "type": "version",
        "tag": "v1.3.13",
        "commit": "f18cb98590471ad9c1e5ae0e57178e9ecb8d384c"
    },
    "_source": "https://github.com/angular/bower-angular-animate.git",
    "_target": "1.3.13"
}

Update 4:

Adding my bower.json

{
  "name": "App",
  "version": "0.0.1",
  "dependencies": {
    "angular": "1.3.13",
    "json3": "3.3.0",
    "es5-shim": "4.0.0",
    "bootstrap": "3.2.0",
    "angular-animate": "1.3.13",
    "angular-cookies": "1.3.13",
    "angular-resource": "1.3.13",
    "angular-route": "1.3.13",
    "angular-sanitize": "1.3.13",
    "angular-touch": "1.3.13",
    "angular-cache": "3.2.5",
    "modernizr": "2.8.3",
    "jquery": "2.1.3",
    "jquery-ui": "1.11.3",
    "angular-bootstrap": "0.12.0",
    "angular-local-storage": "0.1.5",
    "highstock-release": "2.0.4",
    "moment": "2.9.0",
    "moment-timezone": "0.3.0",
    "angular-ui-sortable": "0.13.3",
    "angular-ui-utils": "bower-unique"
  },
  "devDependencies": {
    "angular-mocks": "1.3.13",
    "angular-scenario": "1.3.13"
  },
  "appPath": "app",
  "resolutions": {
    "angular": "1.3.13"
  }
}

Update 5

I runned the tests for bower on the buildserver and as I can see it looks like I have a proxy/permission problem. Looks like we get a 403. I include parts of the output for the boer tests below:

[18:27:57] [0m  1) UrlResolver .hasNew should resolve to false if cache headers haven't changed:
[18:27:57] [0m [31m     Uncaught Error: expected true to equal false [0m [90m
...
[18:27:57] [0m  2) UrlResolver .hasNew should resolve to true if server responds with 304 (ETag mechanism):
[18:27:57] [0m [31m     Uncaught Error: expected true to equal false [0m [90m
...
[18:27:57] [0m  3) UrlResolver .hasNew should work with redirects:
[18:27:57] [0m [31m     Uncaught Error: expected true to equal false [0m [90m
...
[18:27:57] [0m  4) UrlResolver .resolve should download file, renaming it to index:
[18:27:57] [0m [31m     Uncaught Error: Status code of 403 [0m [90m
...
[18:27:57] [0m  5) UrlResolver .resolve should extract if source is an archive:
[18:27:57] [0m [31m     Uncaught Error: Status code of 403 [0m [90m
...
[18:27:57] [0m  6) UrlResolver .resolve should extract if source is an archive (case insensitive):
[18:27:57]
[18:27:57] [0m [31m     Uncaught Error: Status code of 403 [0m [90m
...
[18:27:57] [0m  7) UrlResolver .resolve should copy extracted folder contents if archive contains only a folder inside:
[18:27:57] [0m [31m     Uncaught Error: Status code of 403 [0m [90m
...
[18:27:57] [0m  8) UrlResolver .resolve should extract if source is an archive and rename to index if it's only one file inside:
[18:27:57] [0m [31m     Uncaught Error: Status code of 403 [0m [90m
[18:27:57]      at createError (/mnt/ext4/builduser7/build-agent-work-dir/1f8c068934a7bbe0/node_modules/bower/lib/util/createError.js:4:15)
[18:27:57]      at Request.<anonymous> (/mnt/ext4/builduser7/build-agent-work-dir/1f8c068934a7bbe0/node_modules/bower/lib/util/download.js:45:40)
[18:27:57]      at Request.emit (events.js:117:20)
[18:27:57] [33mWarning: Task "simplemocha:full" failed.  Use --force to continue. [39m
[18:27:57]      at Request.onResponse (/mnt/ext4/builduser7/build-agent-work-dir/1f8c068934a7bbe0/node_modules/bower/node_modules/request/request.js:1085:10)
...
[18:27:57] [0m  9) UrlResolver .resolve should extract if source is an archive and not rename to index if inside it's just a just bower.json/component.json file in it:
[18:27:57] [0m [31m     Uncaught Error: Status code of 403 [0m [90m
....
[18:27:57] [0m  10) UrlResolver .resolve should rename single file from a single folder to index when source is an archive:
[18:27:57] [0m [31m     Uncaught Error: Status code of 403 [0m [90m
....
[18:27:57] [0m  11) UrlResolver .resolve should extract if response content-type is an archive:
[18:27:57] [0m [31m     Uncaught Error: Status code of 403 [0m [90m
....
[18:27:57] [0m  12) UrlResolver .resolve should extract if response content-disposition filename is an archive:
[18:27:57] [0m [31m     Uncaught Error: Status code of 403 [0m [90m
...
[18:27:57] [0m  13) UrlResolver .resolve should save the release if there's a E-Tag:
[18:27:57] [0m [31m     Uncaught Error: Status code of 403 [0m [90m
...
[18:27:57] [0m  14) UrlResolver .resolve should allow for query strings in URL:
[18:27:57] [0m [31m     Uncaught Error: Status code of 403 [0m [90m
...
[18:27:57] [0m  15) UrlResolver .resolve should save cache headers:
[18:27:57] [0m [31m     Uncaught Error: Status code of 403 [0m [90m
....
[18:27:57] [0m  16) UrlResolver .resolve should work with redirects:
[18:27:57] [0m [31m     Uncaught Error: Status code of 403 [0m [90m
....
[18:27:57] [0m  17) UrlResolver .resolve content-disposition validation should work with and without quotes:
[18:27:57] [0m [31m     Uncaught Error: Status code of 403 [0m [90m
...
[18:27:57] [0m  18) UrlResolver .resolve content-disposition validation should not work with partial quotes:
[18:27:57] [0m [31m     Uncaught Error: Status code of 403 [0m [90m
...
[18:27:57] [0m  19) UrlResolver .resolve content-disposition validation should not work if the filename contain chars other than alphanumerical, dashes, spaces and dots:
[18:27:57] [0m [31m     Uncaught Error: Status code of 403 [0m [90m
...
[18:27:57] [0m  20) UrlResolver .resolve content-disposition validation should trim leading and trailing spaces:
[18:27:57] [0m [31m     Uncaught Error: Status code of 403 [0m [90m
...
[18:27:57] [0m  21) UrlResolver .resolve content-disposition validation should not work if the filename ends with a dot:
[18:27:57] [0m [31m     Uncaught Error: Status code of 403 [0m [90m
...
[18:27:57] [0m  22) UrlResolver .resolve content-disposition validation should be case insensitive:
[18:27:57] [0m [31m     Uncaught Error: Status code of 403 [0m [90m
...
[18:27:57] [0m  23) GitResolver ._cleanup should remove the .git folder from the temp dir:
[18:27:57] [0m [31m     Uncaught Error: ENOENT, lstat '/mnt/ext4/builduser7/build-agent-work-dir/1f8c068934a7bbe0/node_modules/bower/.git' [0m [90m
...
[18:27:57] [0m  24) GitFsResolver .resolve should checkout correctly if resolution is a branch:
[18:27:57] [0m [31m     Uncaught Error: Tag/branch some-branch does not exist [0m [90m
...
[18:27:57] [0m  25) GitFsResolver .resolve should leave the original repository untouched:
[18:27:57] [0m [31m     Uncaught Error: Tag/branch some-branch does not exist [0m [90m
...
[18:27:57] [0m  26) GitFsResolver .resolve should copy source folder permissions:
[18:27:57] [0m [31m     Uncaught Error: Tag/branch some-branch does not exist [0m [90m
...
[18:27:57] [0m  27) GitFsResolver #refs should resolve to the references of the local repository:
[18:27:57]
[18:27:57]       [31mUncaught Error: expected [ '0a7daf646d4fd743b6ef701d63bdbe20eee422de refs/tags/0.0.1',
...
[18:27:57] [0m  28) GitFsResolver #refs should cache the results:
[18:27:57]
[18:27:57]       [31mUncaught Error: expected [ '0a7daf646d4fd743b6ef701d63bdbe20eee422de refs/tags/0.0.1',
...
[18:27:57] [0m  29) GitRemoteResolver .resolve should checkout correctly if resolution is a branch:
[18:27:57] [0m [31m     Uncaught Error: Tag/branch some-branch does not exist [0m [90m
....
[18:27:57] [0m  30) GitRemoteResolver #refs should resolve to the references of the remote repository:
[18:27:57]
[18:27:57]       [31mUncaught Error: expected [ '0a7daf646d4fd743b6ef701d63bdbe20eee422de refs/tags/0.0.1',
...
[18:27:57] [0m  31) GitRemoteResolver #refs should cache the results:
[18:27:57]
[18:27:57]       [31mUncaught Error: expected [ '0a7daf646d4fd743b6ef701d63bdbe20eee422de refs/tags/0.0.1',
...
[18:27:57] [0m  32) GitHub .constructor should ensure .git in the source:
[18:27:57] [0m [31m     Error: expected 'https://github.com/twitter/bower.git' to equal 'git://github.com/twitter/bower.git' [0m [90m
...
[18:27:57] [0m  33) resolverFactory should recognize git remote endpoints correctly:
[18:27:57] [0m [31m     Uncaught Error: expected 'https://github.com/bower/bower.git' to equal 'git://github.com/bower/bower.git' [0m [90m
...
[18:27:57] [0m  34) resolverFactory should recognize GitHub endpoints correctly:
[18:27:57] [0m [31m     Uncaught Error: expected 'https://github.com/user/project.git' to equal 'git://github.com/user/project.git' [0m [90m
...
[18:27:57] [0m  35) resolverFactory should recognize registry endpoints correctly:
[18:27:57] [0m [31m     Uncaught Error: expected 'https://github.com/IndigoUnited/dejavu.git' to equal 'git://github.com/IndigoUnited/dejavu.git' [0m [90m
...
[18:27:57] [0m  36) resolverFactory should use the configured shorthand resolver:
[18:27:57] [0m [31m     Uncaught Error: expected 'https://github.com/bower/bower.git' to equal 'git://github.com/bower/bower.git' [0m [90m

解决方案

We ran into the same issue, it had to do with the tmp directory that was used by bower being on nfs storage. Verify that your tmp dir (either specified by "tmp" in .bowerrc or env var TMP_DIR) isn't on nfs mounted storage.

这篇关于Bower在文件结构中安装不同的相同包的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆