Angular: перемещение библиотеки в каталог вызывает проблемы - PullRequest
1 голос
/ 07 мая 2019

Я создал каталог "libs" в папке "projects" с намерением разместить там свои библиотеки. Однако, когда я пытаюсь запустить ng test libraryName, CLI не использует правильный путь для библиотеки. Инстинктивно я полагал, что допустил ошибку при указании пути в файле angular.json, но это не так. По некоторым причинам размещение библиотек внутри каталога вызывает проблемы.

Угловая информация:

     _                      _                 ____ _     ___
    / \   _ __   __ _ _   _| | __ _ _ __     / ___| |   |_ _|
   / △ \ | '_ \ / _` | | | | |/ _` | '__|   | |   | |    | |
  / ___ \| | | | (_| | |_| | | (_| | |      | |___| |___ | |
 /_/   \_\_| |_|\__, |\__,_|_|\__,_|_|       \____|_____|___|
                |___/


Angular CLI: 6.2.9
Node: 10.15.3
OS: win32 x64
Angular: 6.1.10
... animations, common, compiler, compiler-cli, core, forms
... http, language-service, platform-browser
... platform-browser-dynamic, router

Package                            Version
------------------------------------------------------------
@angular-devkit/architect          0.8.9
@angular-devkit/build-angular      0.8.9
@angular-devkit/build-ng-packagr   0.8.9
@angular-devkit/build-optimizer    0.8.9
@angular-devkit/build-webpack      0.8.9
@angular-devkit/core               0.8.9
@angular-devkit/schematics         0.8.9
@angular/cli                       6.2.9
@ngtools/json-schema               1.1.0
@ngtools/webpack                   6.2.9
@schematics/angular                0.8.9
@schematics/update                 0.8.9
ng-packagr                         4.7.1
rxjs                               6.2.2
typescript                         2.9.2
webpack                            4.16.4

Структура проекта по умолчанию (без ошибок):

image

Желаемая структура проекта (вызывает ошибки):

image

Шаги для воспроизведения :

  1. Создать новый проект (ng new projectName)
  2. Перейдите в каталог проектов (cd projectName)
  3. Создать библиотеку (ng generate library libraryName)
  4. Создайте каталог в разделе "projects" с именем "libs".
  5. Переместить библиотеку в "libs".
  6. Измените пути, найденные для "libraryName" в angular.json, чтобы отразить изменение, сделанное на шаге 5. (т. Е. Изменить путь с 'projects / libraryName' на 'projects / libs / libraryName'
  7. Выполнить ng test libraryName (или ng build libraryName / ng lint libraryName)
  8. Ошибка углового интерфейса командной строки.

angular.json:

{
  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
  "version": 1,
  "newProjectRoot": "projects",
  "projects": {
    "angularLibraryGenerateTest": {
      "root": "",
      "sourceRoot": "src",
      "projectType": "application",
      "prefix": "app",
      "schematics": {},
      "architect": {
        "build": {
          "builder": "@angular-devkit/build-angular:browser",
          "options": {
            "outputPath": "dist/angularLibraryGenerateTest",
            "index": "src/index.html",
            "main": "src/main.ts",
            "polyfills": "src/polyfills.ts",
            "tsConfig": "src/tsconfig.app.json",
            "assets": [
              "src/favicon.ico",
              "src/assets"
            ],
            "styles": [
              "src/styles.css"
            ],
            "scripts": []
          },
          "configurations": {
            "production": {
              "fileReplacements": [
                {
                  "replace": "src/environments/environment.ts",
                  "with": "src/environments/environment.prod.ts"
                }
              ],
              "optimization": true,
              "outputHashing": "all",
              "sourceMap": false,
              "extractCss": true,
              "namedChunks": false,
              "aot": true,
              "extractLicenses": true,
              "vendorChunk": false,
              "buildOptimizer": true
            }
          }
        },
        "serve": {
          "builder": "@angular-devkit/build-angular:dev-server",
          "options": {
            "browserTarget": "angularLibraryGenerateTest:build"
          },
          "configurations": {
            "production": {
              "browserTarget": "angularLibraryGenerateTest:build:production"
            }
          }
        },
        "extract-i18n": {
          "builder": "@angular-devkit/build-angular:extract-i18n",
          "options": {
            "browserTarget": "angularLibraryGenerateTest:build"
          }
        },
        "test": {
          "builder": "@angular-devkit/build-angular:karma",
          "options": {
            "main": "src/test.ts",
            "polyfills": "src/polyfills.ts",
            "tsConfig": "src/tsconfig.spec.json",
            "karmaConfig": "src/karma.conf.js",
            "styles": [
              "src/styles.css"
            ],
            "scripts": [],
            "assets": [
              "src/favicon.ico",
              "src/assets"
            ]
          }
        },
        "lint": {
          "builder": "@angular-devkit/build-angular:tslint",
          "options": {
            "tsConfig": [
              "src/tsconfig.app.json",
              "src/tsconfig.spec.json"
            ],
            "exclude": [
              "**/node_modules/**"
            ]
          }
        }
      }
    },
    "angularLibraryGenerateTest-e2e": {
      "root": "e2e/",
      "projectType": "application",
      "architect": {
        "e2e": {
          "builder": "@angular-devkit/build-angular:protractor",
          "options": {
            "protractorConfig": "e2e/protractor.conf.js",
            "devServerTarget": "angularLibraryGenerateTest:serve"
          },
          "configurations": {
            "production": {
              "devServerTarget": "angularLibraryGenerateTest:serve:production"
            }
          }
        },
        "lint": {
          "builder": "@angular-devkit/build-angular:tslint",
          "options": {
            "tsConfig": "e2e/tsconfig.e2e.json",
            "exclude": [
              "**/node_modules/**"
            ]
          }
        }
      }
    },
    "libraryName": {
      "root": "projects/libs/libraryName",
      "sourceRoot": "projects/libs/libraryName/src",
      "projectType": "library",
      "prefix": "lib",
      "architect": {
        "build": {
          "builder": "@angular-devkit/build-ng-packagr:build",
          "options": {
            "tsConfig": "projects/libs/libraryName/tsconfig.lib.json",
            "project": "projects/libs/libraryName/ng-package.json"
          }
        },
        "test": {
          "builder": "@angular-devkit/build-angular:karma",
          "options": {
            "main": "projects/libs/libraryName/src/test.ts",
            "tsConfig": "projects/libs/libraryName/tsconfig.spec.json",
            "karmaConfig": "projects/libs/libraryName/karma.conf.js"
          }
        },
        "lint": {
          "builder": "@angular-devkit/build-angular:tslint",
          "options": {
            "tsConfig": [
              "projects/libs/libraryName/tsconfig.lib.json",
              "projects/libs/libraryName/tsconfig.spec.json"
            ],
            "exclude": [
              "**/node_modules/**"
            ]
          }
        }
      }
    }
  },
  "defaultProject": "angularLibraryGenerateTest"
}

Я ожидал, что ng test libraryName выполнит модульные тесты, но вместо этого я получаю следующую ошибку:

error TS5058: The specified path does not exist: 'C:/Users/user/projectName/projects/tsconfig.json'.

Error: error TS5058: The specified path does not exist: 'C:/Users/user/projectName/projects/tsconfig.json'.

Примечание: Используемый путь неверен. Это должно быть 'C: / Users / user / projectName / projects / libs / libraryName / tsconfig.json' вместо 'C: / Users / user / projectName / projects / tsconfig .json '

1 Ответ

2 голосов
/ 08 мая 2019

Вы должны отрегулировать относительный путь в tsconfig.lib.json.При перемещении библиотеки на один каталог глубже, некоторые относительные пути должны быть скорректированы.

измененные проекты / libs / library-name / tsconfig.lib.json

{
  "extends": "../../../tsconfig.json",
  "compilerOptions": {
    "outDir": "../../../out-tsc/spec",
    "types": [
      "jasmine",
      "node"
    ]
  },
  "files": [
    "src/test.ts"
  ],
  "include": [
    "**/*.spec.ts",
    "**/*.d.ts"
  ]
}

Три каталога вместо двух.
Это необходимо, например, для команды ng build. То же самое относится к projects/libs/library-name/tsconfig.spec.json, который необходим для команды ng test.


Примечание. Используемый путь неверен.Это должно быть 'C: /Users/user/projectName/projects/libs/libraryName/librarytsconfig.json' вместо 'C: /Users/user/projectName/projects/tsconfig.json'

Это прямо наоборот.Путь в выходных данных консоли является правильным, поскольку начальный tsconfig.lib.json имеет относительные пути, подобные этому ../../tsconfig.json, и поэтому заканчивается /projectName/projects/ вместо просто projectName/, где расположен tsconfig.json, который должен быть расширен.

...