質問はかなり基本的ですが、私はそれを見つけることができません。
ng new my-project
を使用して新しいアプリを作成し、その後にng g library my-library
を追加しました。次に、コマンドng build
を実行しましたが、アプリをビルドするだけで、ライブラリやe2eプロジェクトはビルドしていません。これは、angular.jsonでdefaultProjectがmy-projectに設定されているためです。これをmy-libraryに変更すると、ng buildがlibをビルドします。
angularにすべてのプロジェクトとライブラリを1つのng-buildでビルドさせる方法はありますか?
そのためにpackage.jsonにスクリプトを追加しましたが、より良い方法が見つかりませんでした。
"scripts": {
"build-all": "ng build lib1 && ng build lib2 && ng build",
"build-all-prod": "ng build lib1 --prod && ng build lib2 --prod && ng build --prod"
},
その後
yarn run build-all
現在、これをすぐに実行できるサポートされた方法はありません。 @oklymenkで提案されているように、今のところ、これらすべてのビルドコマンドをチェーン化するカスタムスクリプトを使用する必要があります。
また、@ Eutrepeが共有しているリンクを見ると、ライブラリを変更するたびに、この再構築物を削除することを計画していることがわかります。
ファイルを変更するたびにng build my-libを実行するのは面倒で時間がかかります。
代わりに、いくつかの同様のセットアップでは、tsconfig内でソースコードへのパスを直接追加します。これにより、アプリの変更がより速く表示されます。
しかし、それを行うのは危険です。これを行うと、アプリのビルドシステムもライブラリをビルドします。ただし、ライブラリはアプリとは異なるビルドシステムを使用してビルドされます。
これらの2つのビルドシステムは、ビルドをわずかに異なるものにするか、完全に異なる機能をサポートします。
これにより、公開されたライブラリの動作が開発セットアップのライブラリとは異なる微妙なバグが発生します。
このため、注意を怠って、推奨される使用法を安全なものにすることにしました。
将来的には、ライブラリの構築に監視サポートを追加して、変更をより迅速に見たいと考えています。
また、Angular CLIに内部依存関係サポートを追加する予定です。つまり、Angular CLIは、アプリがライブラリに依存していることを認識し、アプリが必要とするときにライブラリを自動的に再構築します。
たぶんこれはあなたのために働く:
ng build --prod --project=your-library
でライブラリをビルドし、package.jsonの依存関係で:
"example-ng6-lib": "file:../example-ng6-lib/dist/example-ng6-lib/example-ng6-lib-0.0.1.tgz",
次に、ng build --prod
ルートプロジェクト。
ここからの例: https://blog.angularindepth.com/creating-a-library-in-angular-6-part-2-6e2bc1e14121
ng-buildにはすでにmain.jsバンドルにライブラリが含まれています。各ライブラリを個別にビルドする必要はありません。
私が知っている限り、現在のバージョン(Angular 8)ではこれを行うための組み込みの方法はありません。
新しいbuilders
を使用することは可能かもしれませんが、それらについてはまだよく知りません。
したがって、代わりにスクリプトを作成し、angular.json
ファイルを読み取り、すべてのapplication
プロジェクトとすべてのconfiguration
sを決定しました。
次に、すべてのプロジェクトと構成に対してng build
を実行します。
また、失敗したすべてのビルドを収集し、最後にコンソールに記録します。
このスクリプトは次のようになります。
import { ProjectType, WorkspaceSchema } from "@schematics/angular/utility/workspace-models";
import { execSync } from "child_process";
import { readFileSync } from "fs";
interface ExecParams {
project: string;
config: string;
}
interface ExecError extends ExecParams {
message: string;
}
function buildAll() {
const json: WorkspaceSchema = JSON.parse(readFileSync("./angular.json").toString());
const errors: ExecError[] = Object.keys(json.projects)
// Filter application-projects
.filter(name => json.projects[name].projectType === ProjectType.Application)
// Determine parameters needed for the build command
.reduce<ExecParams[]>((arr, project) => {
const proj = json.projects[project];
let build = proj.architect && proj.architect.build;
if (build) {
arr = arr.concat(...Object.keys(build.configurations || {})
.map(config => ({ project, config }))
);
}
return arr;
}, [])
// Execute `ng build` and collect errors.
.reduce<ExecError[]>((err, exec) => {
try {
console.log(`Building ${exec.project} (${exec.config}):`);
execSync(`ng build --prod --project ${exec.project} --configuration ${exec.config}`, {stdio: "inherit"});
}
catch (error) {
err.Push({
project: exec.project,
config: exec.config,
message: error.message
});
}
console.log("\n");
return err;
}, []);
// Conditionally log errors
if (errors.length === 0)
console.log("Completed");
else {
console.log("\n");
errors.forEach(error => {
console.error(`Building ${error.project} (${error.config}) failed:\n\t${error.message}`);
});
}
}
buildAll();
tsc
を使用してコンパイルし、NodeJs
で実行できます。
angular.json
と同じフォルダーに配置されたときに、ファイルを取り込み、プロジェクトをループし、非同期でバッチでビルドするスクリプトを作成しました。
ここに簡単な要点があります。出力パスと非同期ビルドの数を切り替えることができます。今のところe2eを除外しましたが、filteredProjects
関数への参照を削除することができ、e2eでもプロジェクトとして実行されます。これをnpm実行スクリプトとしてpackage.json
に追加するのも簡単です。これまでのところ、うまく機能しています。
https://Gist.github.com/bmarti44/f6b8d3d7b331cd79305ca8f45eb8997b
const fs = require('fs'),
spawn = require('child_process').spawn,
// Custom output path.
outputPath = '/nba-angular',
// Number of projects to build asynchronously.
batch = 3;
let ngCli;
function buildProject(project) {
return new Promise((resolve, reject) => {
let child = spawn('ng', ['build', '--project', project, '--prod', '--extract-licenses', '--build-optimizer', `--output-path=${outputPath}/dist/` + project]);
child.stdout.on('data', (data) => {
console.log(data.toString());
});
child.stderr.on('data', (data) => {
process.stdout.write('.');
});
child.on('close', (code) => {
if (code === 0) {
resolve(code);
} else {
reject(code);
}
});
})
}
function filterProjects(projects) {
return Object.keys(projects).filter(project => project.indexOf('e2e') === -1);
}
function batchProjects(projects) {
let currentBatch = 0,
i,
batches = {};
for (i = 0; i < projects.length; i += 1) {
if ((i) % batch === 0) {
currentBatch += 1;
}
if (typeof (batches['batch' + currentBatch]) === 'undefined') {
batches['batch' + currentBatch] = [];
}
batches['batch' + currentBatch].Push(projects[i]);
}
return batches;
}
fs.readFile('angular.json', 'utf8', async (err, data) => {
let batches = {},
batchesArray = [],
i;
if (err) {
throw err;
}
ngCli = JSON.parse(data);
batches = batchProjects(filterProjects(ngCli.projects));
batchesArray = Object.keys(batches);
for (i = 0; i < batchesArray.length; i += 1) {
let promises = [];
batches[batchesArray[i]].forEach((project) => {
promises.Push(buildProject(project));
});
console.log('Building projects ' + batches[batchesArray[i]].join(','));
await Promise.all(promises).then(statusCode => {
console.log('Projects ' + batches[batchesArray[i]].join(',') + ' built successfully!');
if (i + 1 === batchesArray.length) {
process.exit(0);
}
}, (reject) => {
console.log(reject);
process.exit(1);
});
}
});
私はこれを見つけてテストします: https://github.com/angular/angular-cli/wiki/stories-create-library
したがって、代わりにng build --prod
を使用する必要がありますng build my-lib --prod