как опубликовать угловую библиотеку типов 2 на npm
Я создал библиотеку типов для углового 2, которая облегчает доступ к моей внутренней поддержке.
Пока это частное репо, но я хочу загрузить его как библиотеку с открытым исходным кодом в github и зарегистрировать его на npm.
Я не совсем уверен, что делать сейчас, поскольку документацию по этому вопросу найти нелегко.
структура папки выглядит следующим образом:
src
|--sdk.ts // entry point
|--services
|--auth.ts
|--database.ts
|--5 more ts files
|--utils
|--utils.ts
|--interfaces.ts
|--tests (8 ..spec.ts files)
моя точка входа (sdk.ts) выглядит так:
import { NgModule, ModuleWithProviders } from '@angular/core';
import { Injectable } from '@angular/core';
import { SelfbitsDatabase } from './services/database';
import { SelfbitsAuth } from './services/auth';
import { SelfbitsAppConfig } from './utils/interfaces';
import { SelfbitsFile } from './services/file';
import { SelfbitsUser } from './services/user';
import { SelfbitsDevice } from './services/device';
import { SelfbitsPush } from './services/push';
import { HttpModule } from '@angular/http';
@Injectable()
export class SelfbitsAngular {
constructor(
public auth : SelfbitsAuth,
public database : SelfbitsDatabase,
public file : SelfbitsFile,
public user : SelfbitsUser,
public device: SelfbitsDevice,
public push : SelfbitsPush
){}
}
export const SELFBITS_PROVIDERS:any[] = [
SelfbitsAngular,
SelfbitsAuth,
SelfbitsDatabase,
SelfbitsFile,
SelfbitsUser,
SelfbitsDevice,
SelfbitsPush
];
@NgModule({
providers:SELFBITS_PROVIDERS,
imports:[ HttpModule ]
})
export class SelfbitsAngularModule{
static initializeApp(config:SelfbitsAppConfig):ModuleWithProviders{
return {
ngModule:SelfbitsAngularModule,
providers:[
{ provide: 'SelfbitsConfig', useValue: config }
]
}
}
}
и здесь webpack.config.js, который на самом деле не делает то, что я хочу...
module.exports = {
entry:'./src/sdk.ts',
output:{
path: helpers.root('dist'),
filename:'selfbitsangular2sdk.js'
},
resolve: {
extensions: ['', '.js', '.ts']
},
module: {
loaders: [
{
test: /\.ts$/,
exclude:'/test/',
loaders: ['ts-loader']
}
]
}
};
Я не уверен, что webpack - это даже правильный выбор. Или, если он нужен, он должен быть упакован и минимизирован. Любые подсказки и подсказки приветствуются!
ура
Ответы
Ответ 1
Угловой университет имеет хорошее, шаг за шагом, учебное пособие по публикации библиотеки Angular 2 для npm, которая затрагивает ваши проблемы/вопросы.
Вы можете предоставить комплектную и раздельную версию, если хотите, я всегда предоставлял бы раздельную версию. В моих библиотеках я не предоставляю пакетную версию и оставляю ее до потребителя, чтобы расслоение и минимизация.
http://blog.angular-university.io/how-to-create-an-angular-2-library-and-how-to-consume-it-jspm-vs-webpack/
Обновленный ответ
Следующие шаги будут проходить процесс создания, тестирования и публикации разделенного углового модуля для потребления потребителем с помощью связки (webpack, угловой cli и т.д.). Для получения более полного ответа, который включает связывание, см. @OleksiiTrekhleb ответ.
Публикация угловой библиотеки 2 может быть пугающей, но когда дело доходит до нее, это действительно ничем не отличается от публикации любого другого пакета на NPM. Следующая информация будет использовать структуру папок:
1. Настройка tsconfig.json
Как и в любой библиотеке типов, вы хотите, чтобы параметр declaration
установлен в true в tsconfig.json
под compilerOptions
чтобы наши потребители могли использовать типы внутри нашего пакета:
"declaration": true
В compilerOptions
мы также хотим указать наш outDir
чтобы сохранить переведенный код отдельно от источника:
"outDir": "./dist"
Мы хотим, чтобы опция include
указывала на нашу исходную папку (примечание include
является родным братом по отношению к compilerOptions
):
"include": [
"./src"
]
Включите опцию экспериментального декоратора в compilerOptions
:
"experimentalDecorators": true,
"emitDecoratorMetadata": true
Чтобы избежать некоторых ошибок при транспиляции, вам также необходимо включить skipLibCheck
:
"skipLibCheck": true
результат
{
"compilerOptions": {
"target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'. */
"module": "commonjs", /* Specify module code generation: 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
"skipLibCheck": true,
"declaration": true, /* Generates corresponding '.d.ts' file. */
"outDir": "./dist", /* Redirect output structure to the directory. */
"strict": true, /* Enable all strict type-checking options. */
"experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
"emitDecoratorMetadata": true /* Enables experimental support for emitting type metadata for decorators. */
},
"include": [
"./src"
]
}
2. Модуль
В этом примере будет использоваться модуль с одним компонентом. Компонент довольно прямолинейный:
./src/helloWorld/helloWorld.component.ts
import { Component } from "@angular/core";
@Component({
selector: 'hello-world',
template: '<div>Hello, world</div>'
})
export class HelloWorldComponent {
}
Модуль должен добавлять расходные компоненты к declarations
и exports
. Нам нужно добавить экспорт, поэтому, когда потребители импортируют наш модуль, они могут также использовать наши компоненты.
./src/helloWorld/helloWorld.module.ts
import { NgModule } from '@angular/core'
import { HelloWorldComponent } from './helloWorld.component';
const components: any[] = [
HelloWorldComponent
];
@NgModule({
declarations: components,
exports: components // Don't forget to export!
})
export class HelloWorldModule {
}
3. Бочка
Чтобы упростить импорт наших модулей, мы используем бочку, файл, который экспортирует все, чтобы потреблять наши потребители.
./src/index.ts
export { HelloWorldModule } from './helloWorld/helloWorld.module';
export { HelloWorldComponent } from './helloWorld/helloWorld.component';
4. Настройка NPM
Package.json
В package.json
измените main
свойство, чтобы указать на наш переполненный ствол, ./dist/index.js
. Также добавьте свойство typings
чтобы указать на наш файл определения баррелей ./dist/index.d.ts
.
Добавьте свойство prepublish
под сценариями в package.json
.
"scripts": {
"prepublish": "tsc"
}
Также обратите внимание, что ваши угловые и зависимые зависимости должны находиться под peerDependencies
а не dependencies
Игнорировать NPM
Создайте файл .npmignore
в корневом каталоге вашего пакета и проигнорируйте папку src
и любые другие файлы, которые вы не хотите публиковать в своем пакете.
src/
*.log
5. Тестирование
Вы можете легко протестировать свои пакеты npm локально с помощью ссылки npm. В папке пакета модуля запустите команду npm link
.
Затем в тестовом проекте запустите команду npm link <my package name>
Теперь вы можете импортировать свой модуль и добавить его в свои проекты тестовых проектов без публикации.
6. Издательский
Теперь ваш пакет может быть опубликован с простой публикацией npm
Ответ 2
Сам процесс публикации довольно прост:
# Login with your existing npm user
npm login
# Bump library version
npm version --patch
# Publish your library
npm publish
Самая сложная задача - правильно подготовить содержимое вашего пакета. package.json
и папку, в которой будет храниться библиотека сборки (один из распространенных способов назвать ее dist
).
Ваша папка dist
должна содержать файлы, которые могут быть использованы для использования в проектах Angular JIT, а также в проектах Angular AOT. Он также должен содержать ваш комплект библиотек, который готов к использованию браузером напрямую (скажем, через SystemJS).
В результате ваша папка dist должна содержать следующие файлы:
- index.umd.js - комплект UMD, готовый к использованию SystemJS
- index.umd.min.js - сокращенная версия пакета для сохранения трафика пользователя
- index.umd.js.map, index.umd.min.js.map - для цели отладки
- *.js - [созданный tsc, помните, что ngc является оберткой] скомпилировал JavaScript-представление компонентов или файлов службы *.ts вашей библиотеки.
- *.d.ts - [созданный tsc, помните, что файлы объявлений ngc являются оберткой]. Поскольку файлы *.ts с типами передаются в файлы *.js, которые не поддерживают типизацию, то компилятору TypeScript необходимо поместить все типы информации в файлы *.d.ts, чтобы иметь возможность использовать эти *.js файлы в TypeScript проектов позже. Кстати, есть проект DefinitelyTyped с множеством определений типов, которые уже были внесены для большого количества библиотек JS, отличных от TypeScript.
- *.metadata.json - метаданные, связанные с текущим компонентом (или NgModule). Это своего рода JSON-представление объектов, которые мы передаем декораторам @Component, @NgModule. Этот файл содержит информацию о том, что NGC будет нуждаться в проектах (а не в библиотеках), которые были в исходной библиотеке *.ts файлов, но не были включены в файлы *.d.ts.
В этом случае ваш файл package.json должен быть уведомлен о ваших файлах сборки через поля main
, module
и typings
:
{
...
"main": "./dist/index.umd.js",
"module": "./dist/index.js",
"typings": "./dist/index.d.ts",
...
}
Вы можете найти более подробное описание того, какие файлы должны находиться в папке dist
и как их скомпилировать в разделе Как создать библиотеку Angular 4 AOT/JIT с внешними шаблонами SCSS/HTML
Ответ 3
Для тех, кто все еще пытается понять, как это сделать:
-
Создайте свою библиотеку с помощью генератора @jvandemo Angular Lib Yeoman
-
После этого вы просто запускаете: npm adduser
и npm publish
Ответ 4
Я работал с/записывал несколько библиотек Angular (2+), и процесс связывания и публикации всегда был болезненным, я нашел этот инструмент, который выполняет всю работу, и делает библиотеку готовой к отправке с ES5, ES6 и Формат CommonJS.
Он очень прост в использовании, вы просто помещаете один файл (входной файл) в свой tsconfig, и я сканирую все ваши файлы и свяжусь с вашей Угловой библиотекой, ее встроенными стилями и шаблонами компонентов!
Я думал, что это будет полезно для других.
Удачи.