ng-docs.github.io icon indicating copy to clipboard operation
ng-docs.github.io copied to clipboard

6.2.3版本library编译问题

Open wszgrcy opened this issue 5 years ago • 13 comments

前几个版本都没问题(鬼知道我前几个版本用的啥,都是直接^..........),某天更新了下版本,编译后也都正常,正常调试,正常构建,但唯独ng build --prod 提示

ERROR in Error during template compile of 'AppModule'
  Function calls are not supported in decorators but 'CyiaHttpModule' was called.

折腾了半天发现了点端倪, 当new一个新项目,把原理的文件的复制过去后,再次编译,出现这个提示(之前也出现,但是为了控制变量新开了个) 导出路径是module->index.ts->public_api.ts->导入模块构建项目--prod失败 但!当把导出路径改成module->public_api.ts->导入模块构建项目--prod成功 对,就是不用中间那一层index.ts,虽然不算圆满的解决了,但是还是不清楚,为何在某个版本后,一个非常正常的导出会报错呢?这里究竟是哪里的问题?有人最近更新模块遇到过吗?


貌似不是上面的问题而是导出epxort * from 'xxx' 如果不显式指定就会出现上面的问题,很郁闷了,如果一个超大的项目真都这样的话不要类似? 是不是隐藏什么配置了?


又遇到其他问题....比如依赖突然不好使(引入后项目编译),必须变成前置依赖........... 是不是最近angular变动太大好好的一些东西突然都宕机了..... 所以说,没事别乱升版本......指不定哪个版本就出现未知问题了......

wszgrcy avatar Sep 23 '18 15:09 wszgrcy

参见 https://angular.cn/guide/aot-compiler#metadata-restrictions

asnowwolf avatar Sep 24 '18 14:09 asnowwolf

@asnowwolf 谢谢,看了一遍,了解了下知识,但是并没找到答案,......

wszgrcy avatar Sep 25 '18 01:09 wszgrcy

看看 CyiaHttpModule 模块中有没有哪个装饰器里面包含了函数调用。装饰器中可用的语法有额外的限制,就像链接中所说的那样,看看是不是哪里违背了它。建议试试用分区注释的方式先定位到文件。 另外,在条件许可的情况下,还是要尽可能频繁的升级版本,这样才不至于把很多版本的不兼容问题积累到一起。

asnowwolf avatar Sep 25 '18 01:09 asnowwolf

另外,如果你做了一个能重现此问题的干净的新项目,可以把它上传到 github 上。

asnowwolf avatar Sep 25 '18 01:09 asnowwolf

另外,如果你做了一个能重现此问题的干净的新项目,可以把它上传到 github 上。

行,我出一个分支,来重现一下这个问题

wszgrcy avatar Sep 25 '18 11:09 wszgrcy

@asnowwolf https://github.com/wszgrcy/cyia-ngx-log/tree/prod%E7%BC%96%E8%AF%91%E5%A4%B1%E8%B4%A5%E9%87%8D%E7%8E%B0readme 分支如上,直接安装后编译即可,readme里面说明了何时会出现这个bug

wszgrcy avatar Sep 25 '18 12:09 wszgrcy

我试过了,把 public_api.ts 改成

export * from './log/log.module';
export * from './log/log.service';
export * from './shared/log-style.define';

是可以正常工作的。

你是不是改完之后忘了 ng build libs 了?每次大的修改都要重新 build 的。 我的全局 ng cli 版本是 6.2.2,但应该对你这个问题没影响才对。

asnowwolf avatar Sep 26 '18 00:09 asnowwolf

我试过了,把 public_api.ts 改成

export * from './log/log.module';
export * from './log/log.service';
export * from './shared/log-style.define';

是可以正常工作的。

你是不是改完之后忘了 ng build libs 了?每次大的修改都要重新 build 的。 我的全局 ng cli 版本是 6.2.2,但应该对你这个问题没影响才对。

@asnowwolf 我知道这个能正常工作,但是不懂,为何导入Index就不行,非要直接导入到哪个文件中,这样如果以后写多了不好整理啊,

wszgrcy avatar Sep 26 '18 01:09 wszgrcy

哦?你是说你现在这个版本不能正常编译吗?我这里也可以啊……没改就直接编译也是通过的。

不过我估计是 Angular 对 public_api 做了特殊处理,因此只有从这里导出的东西才能被其它模块使用。比如 Angular 本身就有很多 public 符号是外界不可用的,这样可以隐藏私有 API。

asnowwolf avatar Sep 26 '18 01:09 asnowwolf

@asnowwolf 现在是凡是在public_api中 export 的是index的(当然默认是那个文件夹),都会报错,必须把index里的导出直接写的public_api中正常,所以郁闷在这里,虽然找到方案但是感觉和自己想的不一样

wszgrcy avatar Sep 26 '18 07:09 wszgrcy

哦,确实重现了,我查查看。

asnowwolf avatar Sep 26 '18 08:09 asnowwolf

关注...

leadCaptive avatar Sep 27 '18 07:09 leadCaptive

@asnowwolf @leadCaptive 虽然不清楚但是确实是index的问题 相关issue 相关文章 经过测试发现,当没有Index的时候,$libraryname.metadata.json的文件会生成的有问题, 但是最奇怪的一点,其实是,有的项目里,不加index也没关系,有的项目中必须加index否则生成出错 今天看了nz-zorro的组件库,没加index,但是我这边的新建一个,不加就不行(以前我也有不加就可以的) 也没功夫研究ts源码怎么实现的这个,反正就是遇到就加上得了

确定可以不加index的情况

  • 分包,正常写library就是一把梭,一个文件夹一个模块,然后导出,最后public_api.ts汇总,分包则是把文件夹中加入 package.json
{
  "ngPackage": {
    "lib": {
      "entryFile": "index.ts"
    }
  }
}

让编译器认为他是一个包,然后单独编译 然后主public_api引用时 public_api

export * from 'libname/sub1'

tsconfig.lib.json

        "libname/*": [
          "./*"
        ]

这样就ok了,这个是ng-zorro的处理方法

wszgrcy avatar Oct 14 '19 07:10 wszgrcy