
Description
(I am on OSX El Capitan, running angular-cli: 0.1.0 node: 4.2.3 os: darwin x64
)
I recently decided to try out Angular Mobile, and so I created an app through the CLI in mobile mode:
ng new example --mobile
I then proceeded to install some @angular-material2
components and started making an app shell.
But when I tried to ng serve
, it failed, telling me that it couldn't find @angular/app-shell
which I imported along with some Material elements in example.component.ts
So then I looked in my package.json
and system js setup, and angular cli build file, and found that @angular/app-shell
and service worker aren't even saved and installed! So then I looked at the "puppy-love" example app from Google I/O and in their package.json they are listed.
So, to recreate the problem, I started a mobile app from scratch and here are the resulting files:
Here are the exact steps I took:
Colins-MacBook-Pro:Desktop colin$ ng new mobile --mobile
Could not start watchman; falling back to NodeWatcher for file system events.
Visit http://ember-cli.com/user-guide/#watchman for more info.
installing ng2
create .clang-format
create .editorconfig
create src/app/mobile.component.css
create src/app/mobile.component.html
create src/app/mobile.component.spec.ts
create src/app/mobile.component.ts
create src/app/environment.ts
create src/app/index.ts
create src/app/shared/index.ts
create src/favicon.ico
create src/icon.png
create src/index.html
create src/main.ts
create src/manifest.webapp
create src/system-config.ts
create src/tsconfig.json
create src/typings.d.ts
create angular-cli-build.js
create angular-cli.json
create config/environment.dev.ts
create config/environment.js
create config/environment.prod.ts
create config/karma-test-shim.js
create config/karma.conf.js
create config/protractor.conf.js
create e2e/app.e2e.ts
create e2e/app.po.ts
create e2e/tsconfig.json
create e2e/typings.d.ts
create .gitignore
create package.json
create public/.npmignore
create tslint.json
create typings.json
Successfully initialized git.
⠧ Installing packages for tooling via npm
├── es6-shim (ambient)
├── angular-protractor (ambient dev)
├── jasmine (ambient dev)
└── selenium-webdriver (ambient dev)
Installed packages for tooling via npm.
Colins-MacBook-Pro:Desktop colin$ cd mobile
Colins-MacBook-Pro:mobile colin$ cat package.json
{
"name": "mobile",
"version": "0.0.0",
"license": "MIT",
"angular-cli": {},
"scripts": {
"start": "ng server",
"postinstall": "typings install",
"lint": "tslint \"src/**/*.ts\"",
"format": "clang-format -i -style=file --glob=src/**/*.ts",
"pree2e": "webdriver-manager update",
"e2e": "protractor"
},
"private": true,
"dependencies": {
"@angular/common": "2.0.0-rc.1",
"@angular/compiler": "2.0.0-rc.1",
"@angular/core": "2.0.0-rc.1",
"@angular/platform-browser": "2.0.0-rc.1",
"@angular/platform-browser-dynamic": "2.0.0-rc.1",
"@angular/router": "2.0.0-rc.1",
"es6-shim": "^0.35.0",
"reflect-metadata": "0.1.3",
"rxjs": "5.0.0-beta.6",
"systemjs": "0.19.26",
"zone.js": "^0.6.12"
},
"devDependencies": {
"angular-cli": "0.0.*",
"clang-format": "^1.0.35",
"codelyzer": "0.0.14",
"ember-cli-inject-live-reload": "^1.4.0",
"jasmine-core": "^2.4.1",
"jasmine-spec-reporter": "^2.4.0",
"karma": "^0.13.15",
"karma-chrome-launcher": "^0.2.3",
"karma-jasmine": "^0.3.8",
"protractor": "^3.3.0",
"ts-node": "^0.5.5",
"tslint": "^3.6.0",
"typescript": "^1.8.10",
"typings": "^0.8.1"
}
}
Colins-MacBook-Pro:mobile colin$
Colins-MacBook-Pro:mobile colin$ cat angular-cli-build.js
/* global require, module */
var Angular2App = require('angular-cli/lib/broccoli/angular2-app');
module.exports = function(defaults) {
return new Angular2App(defaults, {
vendorNpmFiles: [
'systemjs/dist/system-polyfills.js',
'systemjs/dist/system.src.js',
'zone.js/dist/*.js',
'es6-shim/es6-shim.js',
'reflect-metadata/*.js',
'rxjs/**/*.js',
'@angular/**/*.js'
]
});
};
Colins-MacBook-Pro:mobile colin$ cat src/system-config.ts
/***********************************************************************************************
* User Configuration.
**********************************************************************************************/
/** Map relative paths to URLs. */
const map: any = {
};
/** User packages configuration. */
const packages: any = {
};
////////////////////////////////////////////////////////////////////////////////////////////////
/***********************************************************************************************
* Everything underneath this line is managed by the CLI.
**********************************************************************************************/
const barrels: string[] = [
// Angular specific barrels.
'@angular/core',
'@angular/common',
'@angular/compiler',
'@angular/http',
'@angular/router',
'@angular/platform-browser',
'@angular/platform-browser-dynamic',
// Thirdparty barrels.
'rxjs',
// App specific barrels.
'app',
'app/shared',
/** @cli-barrel */
];
const cliSystemConfigPackages: any = {};
barrels.forEach((barrelName: string) => {
cliSystemConfigPackages[barrelName] = { main: 'index' };
});
/** Type declaration for ambient System. */
declare var System: any;
// Apply the CLI SystemJS configuration.
System.config({
map: {
'@angular': 'vendor/@angular',
'rxjs': 'vendor/rxjs',
'main': 'main.js'
},
packages: cliSystemConfigPackages
});
// Apply the user's configuration.
System.config({ map, packages });
Colins-MacBook-Pro:mobile colin$
So there are the three main files, printed out in my terminal: package.json
, angular-cli-build.js
, and system-config.ts
.
Now let's compare them to the files from the puppy-love
Google I/O example app:
puppy-love-io/package.json:
{
"name": "puppy-love-io",
"version": "0.0.0",
"license": "MIT",
"angular-cli": {},
"scripts": {
"start": "ng server",
"postinstall": "typings install",
"lint": "tslint \"src/**/*.ts\"",
"test": "ng test",
"pree2e": "webdriver-manager update",
"e2e": "protractor"
},
"private": true,
"dependencies": {
"@angular/common": "2.0.0-rc.1",
"@angular/compiler": "2.0.0-rc.1",
"@angular/core": "2.0.0-rc.1",
"@angular/http": "2.0.0-rc.1",
"@angular/platform-browser": "2.0.0-rc.1",
"@angular/platform-browser-dynamic": "2.0.0-rc.1",
"@angular/router": "2.0.0-rc.1",
"es6-shim": "^0.35.0",
"reflect-metadata": "0.1.3",
"rxjs": "5.0.0-beta.6",
"systemjs": "0.19.26",
"zone.js": "^0.6.12"
},
"devDependencies": {
"@angular/platform-server": "2.0.0-rc.1",
"@angular/router-deprecated": "2.0.0-rc.1",
"@angular/service-worker": "^0.2.0",
"@angular/app-shell": "^0.0.0",
"angular2-broccoli-prerender": "^0.11.0",
"angular2-universal":"^0.100.3",
"angular2-universal-polyfills": "^0.4.1",
"preboot": "^2.0.10",
"angular-cli": "^1.0.0-beta.4",
"codelyzer": "0.0.19",
"ember-cli-inject-live-reload": "^1.4.0",
"jasmine-core": "^2.4.1",
"jasmine-spec-reporter": "^2.4.0",
"karma": "^0.13.15",
"karma-chrome-launcher": "^0.2.3",
"karma-jasmine": "^0.3.8",
"protractor": "^3.3.0",
"ts-node": "^0.5.5",
"tslint": "^3.6.0",
"typescript": "^1.8.10",
"typings": "^0.8.1"
}
}
puppy-love-io/angular-cli-build.js:
/* global require, module */
var Angular2App = require('angular-cli/lib/broccoli/angular2-app');
module.exports = function(defaults) {
return new Angular2App(defaults, {
vendorNpmFiles: [
'systemjs/dist/system-polyfills.js',
'systemjs/dist/system.src.js',
'zone.js/dist/**/*.+(js|js.map)',
'es6-shim/es6-shim.js',
'reflect-metadata/**/*.+(js|js.map)',
'rxjs/**/*.+(js|js.map)',
'@angular/**/*.+(js|js.map)',
'@angular2-material/**/*',
'angularfire2/**/*',
'firebase/lib/*.js'
]
});
};
puppy-love-io/src/system-config.ts:
/***********************************************************************************************
* User Configuration.
**********************************************************************************************/
/** Map relative paths to URLs. */
const map:any = {
'@angular2-material': 'vendor/@angular2-material',
'angularfire2': 'vendor/angularfire2',
'firebase': 'vendor/firebase'
};
/** User packages configuration. */
const packages:any = {
'angularfire2': {main: 'angularfire2.js'},
'firebase': {main: 'lib/firebase-web.js'}
};
const materialPkgs:string[] = [
'core',
'toolbar',
'icon',
'button',
'sidenav',
'list',
'card',
'input',
];
materialPkgs.forEach((pkg) => {
packages[`@angular2-material/${pkg}`] = {main: `${pkg}.js`};
});
////////////////////////////////////////////////////////////////////////////////////////////////
/***********************************************************************************************
* Everything underneath this line is managed by the CLI.
**********************************************************************************************/
const barrels:string[] = [
// Angular specific barrels.
'@angular/core',
'@angular/common',
'@angular/compiler',
'@angular/http',
'@angular/router-deprecated',
'@angular/platform-browser',
'@angular/platform-browser-dynamic',
'@angular/app-shell',
// Thirdparty barrels.
'rxjs',
// App specific barrels.
'app',
'app/shared',
'app/+dogs'
/** @cli-barrel */
];
const cliSystemConfigPackages:any = {};
barrels.forEach((barrelName:string) => {
cliSystemConfigPackages[barrelName] = {main: 'index'};
});
/** Type declaration for ambient System. */
declare var System:any;
// Apply the CLI SystemJS configuration.
System.config({
map: {
'@angular': 'vendor/@angular',
'rxjs': 'vendor/rxjs',
'main': 'main.js'
},
packages: cliSystemConfigPackages
});
// Apply the user's configuration.
System.config({map, packages});
As you can see, there are several differences:
The package.json
in puppy-love
is different than mine. It requires several additional packages, including:
"@angular/platform-server": "2.0.0-rc.1",
"@angular/router-deprecated": "2.0.0-rc.1",
"@angular/service-worker": "^0.2.0",
"@angular/app-shell": "^0.0.0",
"angular2-broccoli-prerender": "^0.11.0",
"angular2-universal":"^0.100.3",
"angular2-universal-polyfills": "^0.4.1",
"preboot": "^2.0.10",
Note "@angular/app-shell"
, the package that was missing and caused my serve
failure.
The same thing goes for the two different system-config.ts
files. Mine is different than puppy-love
's, omitting @angular/app-shell',
from const barrels:string[]
.
So I kind of see where my problem is, and I could probably fix it by manually requiring these files. But my real question is why these files weren't included, even though I used the --mobile
flag at ng new
. Did I do something wrong, or is there a problem with the CLI?
Thanks for reviewing my issue, and I hope you guys have some feedback for me!
Colin Pirillo
@colindevs