Les fournisseurs arborescents déclenchent le compilateur Angular pour introduire des instructions d'importation dans le code de l'utilisateur, ce que nous ne faisions pas auparavant. Il s'avère que nous avons des endroits où nous confondons les chemins de modules sur le disque avec les noms de modules (les versions antérieures du compilateur n'avaient pas cette distinction)
Nous finissons donc par écrire des importations comme import {} from 'wksp/packages/path/to/thing'
qui auraient dû être import {} from '@pkg_name/path/to/thing'
Pour autant que nous le sachions, ce problème n'affecte que les utilisateurs de Bazel qui compilent avec ngc
et utilisent des fournisseurs pouvant être modifiés par arbre. Jusqu'à présent, nous n'avons vu ce problème qu'en interne dans Angular.
Ceci a été trouvé dans le cadre de #20030
Pour reproduire, ajoutez un fournisseur arborescent, par exemple coller dans packages/common/src/common_module.ts
import {Injectable, PLATFORM_ID} from '@angular/core';
import {DOCUMENT, isPlatformBrowser} from '@angular/common';
export function viewportScrollerFactory(platformId: string, document: any) {
return isPlatformBrowser(platformId) ? null: null;
}
@Injectable(
{providedIn: 'root', useFactory: viewportScrollerFactory, deps: [PLATFORM_ID, DOCUMENT]})
export abstract class ViewportScroller {}
puis construisez le paquet npm
bazel build //packages/common:npm_package
Et recherchez la chaîne angular/packages
dans la sortie :
$ export bin=$(bazel info bazel-bin)
$ find $bin -type f -exec fgrep -l angular/packages {} \; | grep -v ngsummary | grep -v ngfactory
nous supprimons les fichiers ngsummary car ils ont toujours eu des chemins sur le disque comme identifiants de module.
Les fichiers ngfactory ne sont pas livrés avec le package, ils sont donc probablement inoffensifs également.
Fait intéressant, nous trouvons la mauvaise importation dans la sortie ES2015 :
bin/packages/common/src/common_module.closure.js
/**
* <strong i="28">@fileoverview</strong> added by tsickle
* <strong i="29">@suppress</strong> {checkTypes} checked by tsc
*/
/**
* <strong i="30">@license</strong>
* Copyright Google Inc. All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
import { NgModule } from '@angular/core';
import { COMMON_DIRECTIVES } from './directives/index';
import { DEPRECATED_PLURAL_FN, NgLocaleLocalization, NgLocalization, getPluralCase } from './i18n/localization';
import { COMMON_DEPRECATED_I18N_PIPES } from './pipes/deprecated/index';
import { COMMON_PIPES } from './pipes/index';
import { Injectable, PLATFORM_ID } from '@angular/core';
import { DOCUMENT, isPlatformBrowser } from '@angular/common';
import * as i0 from "@angular/core";
import * as i1 from "@angular/core/src/application_tokens";
import * as i2 from "angular/packages/common/src/dom_tokens"; // <-------------------------
mais pas dans la sortie ES5
bin/packages/common/src/common_module.js
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define("@angular/common/src/common_module", ["require", "exports", "tslib", "@angular/core", "@angular/common/src/directives/index", "@angular/common/src/i18n/localization", "@angular/common/src/pipes/deprecated/index", "@angular/common/src/pipes/index", "@angular/core", "@angular/common", "@angular/core", "@angular/core/src/application_tokens", "@angular/common/src/dom_tokens"], factory);
}
})(function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var core_1 = require("@angular/core");
var index_1 = require("@angular/common/src/directives/index");
var localization_1 = require("@angular/common/src/i18n/localization");
var index_2 = require("@angular/common/src/pipes/deprecated/index");
var index_3 = require("@angular/common/src/pipes/index");
var core_2 = require("@angular/core");
var common_1 = require("@angular/common");
var i0 = require("@angular/core");
var i1 = require("@angular/core/src/application_tokens");
var i2 = require("@angular/common/src/dom_tokens");
Nous rencontrons également ce problème maintenant.
Nous appelons les API du compilateur en interne dans un mono-repo, cela se traduit pour nous en interne également par des chemins d'importation tels que :
import * as i1 from "@our-group/our-package/src/some-service";
Cela se produit pour nous dans la sortie ES5, mais je suppose que la cause première est similaire.
Les solutions de contournement pour nous consistent à définir l'usine nous-mêmes dans le @Injectable. Cela empêche angulaire de générer l'usine et donc de générer l'importation défectueuse.
Je ne sais pas si je dois fournir plus d'informations / reproductibles :
Commentaire le plus utile
Nous rencontrons également ce problème maintenant.
Nous appelons les API du compilateur en interne dans un mono-repo, cela se traduit pour nous en interne également par des chemins d'importation tels que :
Cela se produit pour nous dans la sortie ES5, mais je suppose que la cause première est similaire.
Les solutions de contournement pour nous consistent à définir l'usine nous-mêmes dans le @Injectable. Cela empêche angulaire de générer l'usine et donc de générer l'importation défectueuse.
Je ne sais pas si je dois fournir plus d'informations / reproductibles :