Bir Angular kütüphanesi oluşturduğunuzda, Angular CLI ile entegre eden şematiklerle birlikte sağlayabilir ve paketleyebilirsiniz.
Şematiklerinizle, kullanıcılarınız kütüphanenizin başlangıç sürümünü yüklemek için ng add'ı,
kütüphanenizde tanımlanan yapıtları oluşturmak için ng generate'i ve bozucu değişiklikler içeren yeni bir sürüm için projelerini uyarlamak üzere ng update'i kullanabilir.
Her üç şematik türü de kütüphanenizle paketleyebileceğiniz bir koleksiyonun parçası olabilir.
Schematics koleksiyonu oluşturma
Bir koleksiyon başlatmak için şematik dosyalarını oluşturmanız gerekir. Aşağıdaki adımlar, herhangi bir proje dosyasını değiştirmeden başlangıç desteğini nasıl ekleyeceğinizi gösterir.
Kütüphanenizin kök klasöründe bir
schematicsklasörü oluşturun.schematics/klasöründe, ilk şematiğiniz için birng-addklasörü oluşturun.schematicsklasörünün kök düzeyinde bircollection.jsondosyası oluşturun.collection.jsondosyasını düzenleyerek koleksiyonunuzun başlangıç şemasını tanımlayın.projects/my-lib/schematics/collection.json (Schematics Collection)
{ "$schema": "../../../node_modules/@angular-devkit/schematics/collection-schema.json", "schematics": { "ng-add": { "description": "Add my library to the project.", "factory": "./ng-add/index#ngAdd", "schema": "./ng-add/schema.json" } } }$schemayolu, Angular Devkit koleksiyon şemasına görelidir.schematicsnesnesi, bu koleksiyonun parçası olan adlandırılmış şematikleri tanımlar.- İlk giriş,
ng-addadlı bir şematik içindir. Açıklamayı içerir ve şematiğiniz çalıştırıldığında çağrılan fabrika fonksiyonuna işaret eder.
Kütüphane projenizin
package.jsondosyasında, şema dosyanızın yolunu içeren bir "schematics" girişi ekleyin. Angular CLI, komutları çalıştırırken koleksiyonunuzdaki adlandırılmış şematikleri bulmak için bu girişi kullanır.
projects/my-lib/package.json (Schematics Collection Reference)
{
"name": "my-lib",
"version": "0.0.1",
"schematics": "./schematics/collection.json",
}
Oluşturduğunuz başlangıç şeması, CLI'a ng add komutunu destekleyen şematiğin nerede bulunacağını söyler.
Artık o şematiği oluşturmaya hazırsınız.
Kurulum desteği sağlama
ng add komutu için bir şematik, kullanıcılarınız için başlangıç kurulum sürecini iyileştirebilir.
Aşağıdaki adımlar bu tür bir şematiği tanımlar.
<lib-root>/schematics/ng-addklasörüne gidin.- Ana dosya olan
index.ts'yi oluşturun. index.ts'yi açın ve şematik fabrika fonksiyonunuz için kaynak kodunu ekleyin.
projects/my-lib/schematics/ng-add/index.ts (ng-add Rule Factory)
import {Rule} from '@angular-devkit/schematics';
import {addRootImport} from '@schematics/angular/utility';
import {Schema} from './schema';
export function ngAdd(options: Schema): Rule {
// Add an import `MyLibModule` from `my-lib` to the root of the user's project.
return addRootImport(
options.project,
({code, external}) => code`${external('MyLibModule', 'my-lib')}`,
);
}
Angular CLI, kütüphanenin en son sürümünü otomatik olarak yükler ve bu örnek, uygulamanın köküne MyLibModule'u ekleyerek bir adım daha ileri gider. addRootImport fonksiyonu, bir kod bloğu döndürmesi gereken bir geri çağrım kabul eder. code fonksiyonuyla etiketlenen dizenin içine herhangi bir kod yazabilirsiniz ve herhangi bir harici sembol, uygun import deyimlerinin oluşturulmasını sağlamak için external fonksiyonuyla sarılmalıdır.
Bağımlılık türünü tanımlama
Kütüphanenin projenin package.json yapılandırma dosyasındaki dependencies'e mi, devDependencies'e mi yoksa hiç kaydedilmemesi mi gerektiğini yapılandırmak için ng-add'in save seçeneğini kullanın.
projects/my-lib/package.json (ng-add Reference)
"ng-add": {
"save": "devDependencies"
},
Olası değerler:
| Değerler | Ayrıntılar |
|---|---|
false |
Paketi package.json'a ekleme |
true |
Paketi dependencies'e ekle |
"dependencies" |
Paketi dependencies'e ekle |
"devDependencies" |
Paketi devDependencies'e ekle |
Schematics'lerinizi derleme
Şematiklerinizi kütüphanenizle birlikte paketlemek için kütüphaneyi şematikleri ayrı olarak derleyecek şekilde yapılandırmanız ve ardından bunları pakete eklemeniz gerekir. Şematiklerinizi kütüphanenizi derledikten sonra derlemeniz gerekir, böylece doğru dizine yerleştirilirler.
- Kütüphanenizin, şematiklerinizi dağıtılan kütüphanenize nasıl derleyeceğine ilişkin talimatlar içeren özel bir TypeScript yapılandırma dosyasına ihtiyacı vardır
- Şematikleri kütüphane paketine eklemek için kütüphanenin
package.jsondosyasına betikler ekleyin
Angular çalışma alanınızda my-lib adlı bir kütüphane projeniz olduğunu varsayalım.
Kütüphaneye şematikleri nasıl derleyeceğini söylemek için, kütüphane derlemesini yapılandıran oluşturulan tsconfig.lib.json dosyasının yanına bir tsconfig.schematics.json dosyası ekleyin.
tsconfig.schematics.jsondosyasını düzenleyerek aşağıdaki içeriği ekleyin.projects/my-lib/tsconfig.schematics.json (TypeScript Config)
{ "compilerOptions": { "baseUrl": ".", "lib": [ "es2018", "dom" ], "declaration": true, "module": "commonjs", "moduleResolution": "node", "noEmitOnError": true, "noFallthroughCasesInSwitch": true, "noImplicitAny": true, "noImplicitThis": true, "noUnusedParameters": true, "noUnusedLocals": true, "rootDir": "schematics", "outDir": "../../dist/my-lib/schematics", "skipDefaultLibCheck": true, "skipLibCheck": true, "sourceMap": true, "strictNullChecks": true, "target": "es6", "types": [ "jasmine", "node" ] }, "include": [ "schematics/**/*" ], "exclude": [ "schematics/*/files/**/*" ] }Seçenekler Ayrıntılar rootDirschematicsklasörünüzün derlenecek girdi dosyalarını içerdiğini belirtir.outDirKütüphanenin çıktı klasörüne eşlenir. Varsayılan olarak bu, çalışma alanınızın kökündeki dist/my-libklasörüdür.Şematik kaynak dosyalarınızın kütüphane paketine derlendiğinden emin olmak için, kütüphane projenizin kök klasöründeki (
projects/my-lib)package.jsondosyasına aşağıdaki betikleri ekleyin.projects/my-lib/package.json (Build Scripts)
{ "name": "my-lib", "version": "0.0.1", "scripts": { "build": "tsc -p tsconfig.schematics.json", "postbuild": "copyfiles schematics/*/schema.json schematics/*/files/** schematics/collection.json ../../dist/my-lib/" }, "peerDependencies": { "@angular/common": "^22.0.0", "@angular/core": "^22.0.0" }, "schematics": "./schematics/collection.json", "ng-add": { "save": "devDependencies" }, "devDependencies": { "copyfiles": "file:../../node_modules/copyfiles", "typescript": "file:../../node_modules/typescript" } }buildbetiği, özeltsconfig.schematics.jsondosyasını kullanarak şematiğinizi derlerpostbuildbetiği,buildbetiği tamamlandıktan sonra şematik dosyalarını kopyalar- Hem
buildhem depostbuildbetiklericopyfilesvetypescriptbağımlılıklarını gerektirir. Bağımlılıkları yüklemek içindevDependenciesiçinde tanımlanan yola gidin ve betikleri çalıştırmadan öncenpm installkomutunu çalıştırın.
Oluşturma desteği sağlama
Kullanıcılarınızın kütüphanenizde tanımlanan bir yapıtı oluşturmak için ng generate komutunu kullanmalarına olanak tanıyan, koleksiyonunuza adlandırılmış bir şematik ekleyebilirsiniz.
Kütüphanenizin bazı kurulum gerektiren my-service adlı bir servis tanımladığını varsayalım.
Kullanıcılarınızın aşağıdaki CLI komutunu kullanarak bunu oluşturabilmesini istiyorsunuz.
ng generate my-lib:my-service
Başlamak için schematics klasöründe my-service adlı yeni bir alt klasör oluşturun.
Yeni şematiği yapılandırma
Koleksiyona bir şematik eklediğinizde, koleksiyonun şemasında ona işaret etmeniz ve bir kullanıcının komuta geçirebileceği seçenekleri tanımlayan yapılandırma dosyaları sağlamanız gerekir.
schematics/collection.jsondosyasını düzenleyerek yeni şematik alt klasörüne işaret edin ve yeni şematik için girdileri belirten bir şema dosyasına bir işaretçi ekleyin.projects/my-lib/schematics/collection.json (Schematics Collection)
{ "$schema": "../../../node_modules/@angular-devkit/schematics/collection-schema.json", "schematics": { "ng-add": { "description": "Add my library to the project.", "factory": "./ng-add/index#ngAdd", "schema": "./ng-add/schema.json" }, "my-service": { "description": "Generate a service in the project.", "factory": "./my-service/index#myService", "schema": "./my-service/schema.json" } } }<lib-root>/schematics/my-serviceklasörüne gidin.Bir
schema.jsondosyası oluşturun ve şematik için mevcut seçenekleri tanımlayın.projects/my-lib/schematics/my-service/schema.json (Schematic JSON Schema)
{ "$schema": "http://json-schema.org/schema", "$id": "SchematicsMyService", "title": "My Service Schema", "type": "object", "properties": { "name": { "description": "The name of the service.", "type": "string" }, "path": { "type": "string", "format": "path", "description": "The path to create the service.", "visible": false, "$default": { "$source": "workingDirectory" } }, "project": { "type": "string", "description": "The name of the project.", "$default": { "$source": "projectName" } } }, "required": [ "name" ] }- id: Koleksiyondaki şema için benzersiz bir kimlik.
- title: Şemanın insan tarafından okunabilir bir açıklaması.
- type: Özellikler tarafından sağlanan türün açıklayıcısı.
- properties: Şematik için mevcut seçenekleri tanımlayan bir nesne.
Her seçenek bir anahtarı bir tür, açıklama ve isteğe bağlı takma adla ilişkilendirir. Tür, beklediğiniz değerin biçimini tanımlar ve açıklama, kullanıcı şematiğiniz için kullanım yardımı istediğinde görüntülenir.
Şematik seçenekleri için ek özelleştirmeler hakkında çalışma alanı şemasına bakın.
Bir
schema.tsdosyası oluşturun veschema.jsondosyasında tanımlanan seçeneklerin değerlerini depolayan bir arayüz tanımlayın.projects/my-lib/schematics/my-service/schema.ts (Schematic Interface)
export interface Schema { // The name of the service. name: string; // The path to create the service. path?: string; // The name of the project. project?: string; }Seçenekler Ayrıntılar name Oluşturulan servis için sağlamak istediğiniz ad. path Şematiğe sağlanan yolu geçersiz kılar. Varsayılan yol değeri geçerli çalışma dizinine dayanır. project Şematiğin çalıştırılacağı belirli bir proje sağlar. Şematikte, seçenek kullanıcı tarafından sağlanmazsa bir varsayılan sağlayabilirsiniz.
Şablon dosyalarını ekleme
Bir projeye yapıtlar eklemek için şematiğinizin kendi şablon dosyalarına ihtiyacı vardır. Şematik şablonları, kod çalıştırma ve değişken değiştirme için özel sözdizimini destekler.
schematics/my-service/klasörü içinde birfiles/klasörü oluşturun.Dosya oluşturmak için kullanılacak bir şablonu tanımlayan
__name@dasherize__.service.ts.templateadlı bir dosya oluşturun. Bu şablon, Angular'ınHttpClient'ını zaten birhttpözelliğine enjekte edilmiş olarak içeren bir servis oluşturacaktır.import { Service } from '@angular/core'; import { HttpClient } from '@angular/common/http'; @Service() export class <%= classify(name) %>Service { private http = inject(HttpClient); }classifyvedasherizemetotları, şematiğinizin kaynak şablonunu ve dosya adını dönüştürmek için kullandığı yardımcı fonksiyonlardır.name, fabrika fonksiyonunuzdan bir özellik olarak sağlanır. Şemada tanımladığınıznameile aynıdır.
Fabrika fonksiyonunu ekleme
Artık altyapı yerinde olduğuna göre, kullanıcının projesinde ihtiyaç duyduğunuz değişiklikleri gerçekleştiren ana fonksiyonu tanımlayabilirsiniz.
Schematics çerçevesi, hem yol hem de içerik şablonlarını destekleyen bir dosya şablonlama sistemi sağlar.
Sistem, girdi Tree'sine yüklenen dosyalar veya yollar içinde tanımlanan yer tutucular üzerinde çalışır.
Bunları Rule'a geçirilen değerlerle doldurur.
Bu veri yapıları ve sözdiziminin ayrıntıları için Schematics README belgesine bakın.
Ana dosya
index.ts'yi oluşturun ve şematik fabrika fonksiyonunuz için kaynak kodunu ekleyin.İlk olarak, ihtiyacınız olacak şematik tanımlarını içe aktarın. Schematics çerçevesi, bir şematiği çalıştırırken kurallar oluşturmak ve kullanmak için birçok yardımcı fonksiyon sunar.
Şematiğinizin seçenekleri için tür bilgisi sağlayan tanımlı şema arayüzünü içe aktarın.
projects/my-lib/schematics/my-service/index.ts (Schema Import)
import { Rule, Tree, SchematicsException, apply, url, applyTemplates, move, chain, mergeWith, } from '@angular-devkit/schematics'; import {strings, normalize, virtualFs, workspaces} from '@angular-devkit/core'; import {Schema as MyServiceSchema} from './schema';Oluşturma şematiğini oluşturmak için boş bir kural fabrikasıyla başlayın.
projects/my-lib/schematics/my-service/index.ts (Initial Rule)
export function myService(options: MyServiceSchema): Rule { return (tree: Tree) => tree; }
Bu kural fabrikası, ağacı değiştirmeden döndürür.
Seçenekler, ng generate komutundan geçirilen seçenek değerleridir.
Bir oluşturma kuralı tanımlama
Artık kullanıcının uygulamasını, kütüphanenizde tanımlanan servis için kurmak üzere gerçekten değiştiren kodu oluşturmak için çerçeveye sahipsiniz.
Kullanıcının kütüphanenizi yüklediği Angular çalışma alanı birden fazla proje (uygulama ve kütüphane) içerir. Kullanıcı projeyi komut satırında belirtebilir veya varsayılana bırakabilir. Her iki durumda da, bu şematiğin uygulandığı belirli projeyi tanımlamanız gerekir, böylece proje yapılandırmasından bilgi alabilirsiniz.
Bunu, fabrika fonksiyonuna geçirilen Tree nesnesini kullanarak yapın.
Tree metotları, çalışma alanınızdaki eksiksiz dosya ağacına erişmenizi sağlar ve şematiğin yürütülmesi sırasında dosyaları okumanıza ve yazmanıza olanak tanır.
Proje yapılandırmasını alma
Hedef projeyi belirlemek için, çalışma alanı yapılandırma dosyası
angular.json'ın içeriğini okumak üzereworkspaces.readWorkspacemetodunu kullanın.workspaces.readWorkspacekullanmak içinTree'den birworkspaces.WorkspaceHostoluşturmanız gerekir. Fabrika fonksiyonunuza aşağıdaki kodu ekleyin.projects/my-lib/schematics/my-service/index.ts (Schema Import)
import { Rule, Tree, SchematicsException, apply, url, applyTemplates, move, chain, mergeWith, } from '@angular-devkit/schematics'; import {strings, normalize, virtualFs, workspaces} from '@angular-devkit/core'; import {Schema as MyServiceSchema} from './schema'; function createHost(tree: Tree): workspaces.WorkspaceHost { return { async readFile(path: string): Promise<string> { const data = tree.read(path); if (!data) { throw new SchematicsException('File not found.'); } return virtualFs.fileBufferToString(data); }, async writeFile(path: string, data: string): Promise<void> { return tree.overwrite(path, data); }, async isDirectory(path: string): Promise<boolean> { return !tree.exists(path) && tree.getDir(path).subfiles.length > 0; }, async isFile(path: string): Promise<boolean> { return tree.exists(path); }, }; } export function myService(options: MyServiceSchema): Rule { return async (tree: Tree) => { const host = createHost(tree); const {workspace} = await workspaces.readWorkspace('/', host); }; }Bağlamın var olduğunu kontrol ettiğinizden ve uygun hatayı fırlattığınızdan emin olun.
Artık proje adına sahip olduğunuza göre, projeye özgü yapılandırma bilgilerini almak için kullanın.
projects/my-lib/schematics/my-service/index.ts (Project)
const project = options.project != null ? workspace.projects.get(options.project) : null; if (!project) { throw new SchematicsException(`Invalid project name: ${options.project}`); } const projectType = project.extensions.projectType === 'application' ? 'app' : 'lib';workspace.projectsnesnesi, projeye özgü tüm yapılandırma bilgilerini içerir.options.path, şematik uygulandığında şematik şablon dosyalarının taşınacağı yeri belirler.Şematiğin şemasındaki
pathseçeneği varsayılan olarak geçerli çalışma diziniyle değiştirilir.pathtanımlanmamışsa, proje yapılandırmasındansourceRoot'uprojectTypeile birlikte kullanın.projects/my-lib/schematics/my-service/index.ts (Project Info)
if (options.path === undefined) { options.path = `${project.sourceRoot}/${projectType}`; }
Kuralı tanımlama
Bir Rule, harici şablon dosyalarını kullanabilir, dönüştürebilir ve dönüştürülmüş şablonla başka bir Rule nesnesi döndürebilir.
Şematiğiniz için gereken özel dosyaları oluşturmak üzere şablonlamayı kullanın.
Fabrika fonksiyonunuza aşağıdaki kodu ekleyin.
projects/my-lib/schematics/my-service/index.ts (Template transform)
const templateSource = apply(url('./files'), [ applyTemplates({ classify: strings.classify, dasherize: strings.dasherize, name: options.name, }), move(normalize(options.path as string)), ]);Metotlar Ayrıntılar apply()Bir kaynağa birden fazla kural uygular ve dönüştürülmüş kaynağı döndürür. 2 argüman alır, bir kaynak ve kurallar dizisi. url()Dosya sisteminizden, şematiğe göre kaynak dosyaları okur. applyTemplates()Şematik şablonuna ve şematik dosya adlarına sunmak istediğiniz metotların ve özelliklerin bir argümanını alır. Bir Ruledöndürür. Buradaclassify()vedasherize()metotlarını venameözelliğini tanımlarsınız.classify()Bir değer alır ve değeri başlık harfleriyle döndürür. Örneğin, sağlanan ad my serviceise,MyServiceolarak döndürülür.dasherize()Bir değer alır ve değeri tireli ve küçük harflerle döndürür. Örneğin, sağlanan ad MyService ise, my-serviceolarak döndürülür.move()Şematik uygulandığında sağlanan kaynak dosyaları hedeflerine taşır. Son olarak, kural fabrikası bir kural döndürmelidir.
projects/my-lib/schematics/my-service/index.ts (Chain Rule)
return chain([mergeWith(templateSource)]);chain()metodu, birden fazla kuralı tek bir kurala birleştirmenize olanak tanır, böylece tek bir şematikte birden fazla işlem gerçekleştirebilirsiniz. Burada yalnızca şablon kurallarını şematik tarafından yürütülen herhangi bir kodla birleştiriyorsunuz.
Aşağıdaki şematik kural fonksiyonunun eksiksiz bir örneğine bakın.
projects/my-lib/schematics/my-service/index.ts
import {
Rule,
Tree,
SchematicsException,
apply,
url,
applyTemplates,
move,
chain,
mergeWith,
} from '@angular-devkit/schematics';
import {strings, normalize, virtualFs, workspaces} from '@angular-devkit/core';
import {Schema as MyServiceSchema} from './schema';
function createHost(tree: Tree): workspaces.WorkspaceHost {
return {
async readFile(path: string): Promise<string> {
const data = tree.read(path);
if (!data) {
throw new SchematicsException('File not found.');
}
return virtualFs.fileBufferToString(data);
},
async writeFile(path: string, data: string): Promise<void> {
return tree.overwrite(path, data);
},
async isDirectory(path: string): Promise<boolean> {
return !tree.exists(path) && tree.getDir(path).subfiles.length > 0;
},
async isFile(path: string): Promise<boolean> {
return tree.exists(path);
},
};
}
export function myService(options: MyServiceSchema): Rule {
return async (tree: Tree) => {
const host = createHost(tree);
const {workspace} = await workspaces.readWorkspace('/', host);
const project = options.project != null ? workspace.projects.get(options.project) : null;
if (!project) {
throw new SchematicsException(`Invalid project name: ${options.project}`);
}
const projectType = project.extensions.projectType === 'application' ? 'app' : 'lib';
if (options.path === undefined) {
options.path = `${project.sourceRoot}/${projectType}`;
}
const templateSource = apply(url('./files'), [
applyTemplates({
classify: strings.classify,
dasherize: strings.dasherize,
name: options.name,
}),
move(normalize(options.path as string)),
]);
return chain([mergeWith(templateSource)]);
};
}
Kurallar ve yardımcı metotlar hakkında daha fazla bilgi için Sağlanan Kurallar belgesine bakın.
Kütüphane schematic'inizi çalıştırma
Kütüphanenizi ve şematiklerinizi derledikten sonra, projenize karşı çalıştırmak için şematik koleksiyonunu yükleyebilirsiniz. Aşağıdaki adımlar, daha önce oluşturduğunuz şematiği kullanarak bir servis oluşturmayı gösterir.
Kütüphanenizi ve schematics'lerinizi derleme
Çalışma alanınızın kökünden, kütüphaneniz için ng build komutunu çalıştırın.
ng build my-lib
Ardından, şematiği derlemek için kütüphane dizininize geçin
cd projects/my-lib
npm run build
Kütüphaneyi bağlama
Kütüphaneniz ve şematikleriniz paketlenmiş ve çalışma alanınızın kökündeki dist/my-lib klasörüne yerleştirilmiştir.
Şematiği çalıştırmak için kütüphaneyi node_modules klasörünüze bağlamanız gerekir.
Çalışma alanınızın kökünden, dağıtılabilir kütüphanenizin yolunu belirterek npm link komutunu çalıştırın.
npm link dist/my-lib
Schematic'i çalıştırma
Artık kütüphaneniz yüklü olduğuna göre, ng generate komutunu kullanarak şematiği çalıştırın.
ng generate my-lib:my-service --name my-data
Konsolda, şematiğin çalıştırıldığını ve my-data.service.ts dosyasının uygulama klasörünüzde oluşturulduğunu göreceksiniz.
CREATE src/app/my-data.service.ts (208 bytes)