When I built my project, I had Grunt copy everything to ~/Web, which is where Apache serves pages from. I've tried running grunt build --debug --verbose
and getting back no errors or warnings. I've also thrown up the idea that it's a problem on my machine, but after trying to load it on a friend's macbook and testing it with every major browser, nothing happens. Something's not firing, I'm just not sure what.
JavaScript console output:
Failed to load resource: the server responded with a status of 404 (Not Found) http://vm-2.levicampbell.koding.kd.io/styles/vendor.css
Uncaught object vm-2.levicampbell.koding.kd.io/scripts/1b24ff92.vendor.js:11
Uncaught object vm-2.levicampbell.koding.kd.io/scripts/1b24ff92.vendor.js:6
GET http://vm-2.levicampbell.koding.kd.io/styles/vendor.css 404 (Not Found) vm- 2.levicampbell.koding.kd.io/:1
Uncaught object 1b24ff92.vendor.js:11
e 1b24ff92.vendor.js:11
(anonymous function) 1b24ff92.vendor.js:17
Uncaught object 1b24ff92.vendor.js:6
(anonymous function) 1b24ff92.vendor.js:6
(anonymous function) 1b24ff92.vendor.js:6
f 1b24ff92.vendor.js:6
k 1b24ff92.vendor.js:6
Hb 1b24ff92.vendor.js:6
$.e 1b24ff92.vendor.js:6
$ 1b24ff92.vendor.js:6
Z 1b24ff92.vendor.js:6
(anonymous function) 1b24ff92.vendor.js:9
k 1b24ff92.vendor.js:4
l.fireWith 1b24ff92.vendor.js:4
eb.extend.ready 1b24ff92.vendor.js:4
h
Gruntfile.js:
// Generated on 2014-06-28 using generator-angular 0.8.0
'use strict';
// # Globbing
// for performance reasons we're only matching one level down:
// 'test/spec/{,*/}*.js'
// use this if you want to recursively match all subfolders:
// 'test/spec/**/*.js'
module.exports = function (grunt) {
// Load grunt tasks automatically
require('load-grunt-tasks')(grunt);
// Time how long tasks take. Can help when optimizing build times
require('time-grunt')(grunt);
// Define the configuration for all the tasks
grunt.initConfig({
// Project settings
yeoman: {
// configurable paths
app: require('./bower.json').appPath || 'app',
dist: '/home/levicampbell/Web'
},
// Watches files for changes and runs tasks based on the changed files
watch: {
bower: {
files: ['bower.json'],
tasks: ['bowerInstall']
}
},
js: {
files: ['<%= yeoman.app %>/scripts/{,*/}*.js'],
tasks: ['newer:jshint:all'],
options: {
livereload: true
}
},
jsTest: {
files: ['test/spec/{,*/}*.js'],
tasks: ['newer:jshint:test', 'karma']
},
gruntfile: {
files: ['Gruntfile.js']
},
livereload: {
options: {
livereload: '<%= connect.options.livereload %>'
},
files: [
'<%= yeoman.app %>/{,*/}*.html',
'.tmp/styles/{,*/}*.css',
'<%= yeoman.app %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}'
]
},
phonegap: {
config: {
root: 'www',
config: 'www/config.xml',
cordova: '.cordova',
html : 'index.html',
path: 'mobile',
plugins: ['/local/path/to/plugin', 'http://example.com/path/to/plugin.git'],
platforms: ['android', 'ios', 'wp8', 'bb10'],
maxBuffer: 500,
verbose: true,
releases: 'releases',
releaseName: function(){
var pkg = grunt.file.readJSON('package.json');
return(pkg.name + '-' + pkg.version);
},
debuggable: true,
name: function(){
var pkg = grunt.file.readJSON('package.json');
return pkg.name;
},
key: {
store: 'release.keystore',
alias: 'release',
aliasPassword: function(){
return('');
},
storePassword: function(){
return('');
}
},
icons: {
android: {
ldpi: 'icon-36-ldpi.png',
mdpi: 'icon-48-mdpi.png',
hdpi: 'icon-72-hdpi.png',
xhdpi: 'icon-96-xhdpi.png'
},
wp8: {
app: 'icon-62-tile.png',
tile: 'icon-173-tile.png'
},
ios: {
icon29: 'icon29.png',
icon29x2: 'icon29x2.png',
icon40: 'icon40.png',
icon40x2: 'icon40x2.png',
icon57: 'icon57.png',
icon57x2: 'icon57x2.png',
icon60x2: 'icon60x2.png',
icon72: 'icon72.png',
icon72x2: 'icon72x2.png',
icon76: 'icon76.png',
icon76x2: 'icon76x2.png'
}
},
screens: {
android: {
ldpi: 'screen-ldpi-portrait.png',
ldpiLand: 'screen-ldpi-landscape.png',
mdpi: 'screen-mdpi-portrait.png',
mdpiLand: 'screen-mdpi-landscape.png',
hdpi: 'screen-hdpi-portrait.png',
hdpiLand: 'screen-hdpi-landscape.png',
xhdpi: 'screen-xhdpi-portrait.png',
xhdpiLand: 'www/screen-xhdpi-landscape.png'
},
ios: {
ipadLand: 'screen-ipad-landscape.png',
ipadLandx2: 'screen-ipad-landscape-2x.png',
ipadPortrait: 'screen-ipad-portrait.png',
ipadPortraitx2: 'screen-ipad-portrait-2x.png',
iphonePortrait: 'screen-iphone-portrait.png',
iphonePortraitx2: 'screen-iphone-portrait-2x.png',
iphone568hx2: 'screen-iphone-568h-2x.png'
}
},
versionCode: function(){ return(1) },
minSdkVersion: function(){ return(10) },
targetSdkVersion: function(){ return(19) },
iosStatusBar: 'WhiteAndTransparent',
remote: {
username: 'john@example.com',
password: 'fakepassword',
platforms: ['android', 'blackberry', 'ios', 'symbian', 'webos', 'wp7']
},
permissions: ['INTERNET', 'ACCESS_COURSE_LOCATION', '...']
}
},
s3: {
options: {
key: 'yeahright',
secret: 'notonyourlife',
bucket: 'production',
access: 'public-read',
gzip: true,
encodePaths: true,
maxOperations: 0,
headers: {
// Two Year cache policy (1000 * 60 * 60 * 24 * 730)
"Cache-Control": "max-age=630720000, public",
"Expires": new Date(Date.now() + 63072000000).toUTCString()
}
},
prod: {
// Files to be uploaded.
upload: [
{
src: '<%= yeoman.dist %>/index.html',
dest: 'index.html',
},
{
src: '<%= yeoman.dist %>/styles/vendor.css',
dest: 'styles/vendor.css'
},
{
src: '<%= yeoman.dist %>/styles/main.css',
dest: 'styles/main.css'
},
{
src: '<%= yeoman.dist %>/scripts/vendor.js',
dest: 'scripts/vendor.js'
},
{
src: '<%= yeoman.dist %>/scripts/scripts.js',
dest: 'scripts/scripts.js'
},
{
src: '<%= yeoman.dist %>/404.html',
dest: '404.html'
},
{
src: '<%= yeoman.dist %>/favicon.ico',
dest: 'favicon.ico'
},
{
src: '<%= yeoman.dist %>/dict.json',
dest: 'dict.json'
},
{
src: '<%= yeoman.dist %>/robots.txt',
dest: 'robots.txt'
},
{
src: '<%= yeoman.dist %>/views/*.html',
dest: 'views'
},
{
src: '<%= yeoman.dist %>/jalarast.js.map',
dest: 'jalarast.js.map'
}
]}
},
// The actual grunt server settings
connect: {
options: {
port: 9000,
// Change this to '0.0.0.0' to access the server from outside.
hostname: 'localhost',
livereload: 35729
},
livereload: {
options: {
open: true,
base: [
'.tmp',
'<%= yeoman.app %>'
]
}
},
test: {
options: {
port: 9001,
base: [
'.tmp',
'test',
'<%= yeoman.app %>'
]
}
},
dist: {
options: {
base: '<%= yeoman.dist %>'
}
}
},
// Make sure code styles are up to par and there are no obvious mistakes
jshint: {
options: {
jshintrc: '.jshintrc',
reporter: require('jshint-stylish')
},
all: [
'Gruntfile.js',
'<%= yeoman.app %>/scripts/{,*/}*.js'
],
test: {
options: {
jshintrc: 'test/.jshintrc'
},
src: ['test/spec/{,*/}*.js']
}
},
// Empties folders to start fresh
clean: {
dist: {
files: [{
dot: true,
src: [
'.tmp',
'<%= yeoman.dist %>/*',
'!<%= yeoman.dist %>/.git*'
]
}]
},
server: '.tmp'
},
// Add vendor prefixed styles
autoprefixer: {
options: {
browsers: ['last 1 version']
},
dist: {
files: [{
expand: true,
cwd: '.tmp/styles/',
src: '{,*/}*.css',
dest: '.tmp/styles/'
}]
}
},
// Automatically inject Bower components into the app
bowerInstall: {
app: {
src: ['<%= yeoman.app %>/index.html'],
ignorePath: '<%= yeoman.app %>/'
},
sass: {
src: ['<%= yeoman.app %>/styles/{,*/}*.{scss,sass}'],
ignorePath: '<%= yeoman.app %>/bower_components/'
}
},
// Compiles Sass to CSS and generates necessary files if requested
compass: {
options: {
sassDir: '<%= yeoman.app %>/styles',
cssDir: '.tmp/styles',
generatedImagesDir: '.tmp/images/generated',
imagesDir: '<%= yeoman.app %>/images',
javascriptsDir: '<%= yeoman.app %>/scripts',
fontsDir: '<%= yeoman.app %>/styles/fonts',
importPath: '<%= yeoman.app %>/bower_components',
httpImagesPath: '/images',
httpGeneratedImagesPath: '/images/generated',
httpFontsPath: '/styles/fonts',
relativeAssets: false,
assetCacheBuster: false,
raw: 'Sass::Script::Number.precision = 10\n'
},
dist: {
options: {
generatedImagesDir: '<%= yeoman.dist %>/images/generated'
}
},
server: {
options: {
debugInfo: true
}
}
},
// Renames files for browser caching purposes
rev: {
dist: {
files: {
src: [
'<%= yeoman.dist %>/scripts/{,*/}*.js',
'<%= yeoman.dist %>/styles/{,*/}*.css',
'<%= yeoman.dist %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}',
'<%= yeoman.dist %>/styles/fonts/*'
]
}
}
},
// Reads HTML for usemin blocks to enable smart builds that automatically
// concat, minify and revision files. Creates configurations in memory so
// additional tasks can operate on them
useminPrepare: {
html: '<%= yeoman.app %>/index.html',
options: {
dest: '<%= yeoman.dist %>',
flow: {
html: {
steps: {
js: ['concat', 'uglifyjs'],
css: ['cssmin']
},
post: {}
}
}
}
},
// Performs rewrites based on rev and the useminPrepare configuration
usemin: {
html: ['<%= yeoman.dist %>/{,*/}*.html'],
css: ['<%= yeoman.dist %>/styles/{,*/}*.css'],
options: {
assetsDirs: ['<%= yeoman.dist %>']
}
},
// The following *-min tasks produce minified files in the dist folder
cssmin: {
options: {
root: '<%= yeoman.app %>'
}
},
imagemin: {
dist: {
files: [{
expand: true,
cwd: '<%= yeoman.app %>/images',
src: '{,*/}*.{png,jpg,jpeg,gif}',
dest: '<%= yeoman.dist %>/images'
}]
}
},
svgmin: {
dist: {
files: [{
expand: true,
cwd: '<%= yeoman.app %>/images',
src: '{,*/}*.svg',
dest: '<%= yeoman.dist %>/images'
}]
}
},
htmlmin: {
dist: {
options: {
collapseWhitespace: true,
collapseBooleanAttributes: true,
removeCommentsFromCDATA: true,
removeOptionalTags: true
},
files: [{
expand: true,
cwd: '<%= yeoman.dist %>',
src: ['*.html', 'views/{,*/}*.html'],
dest: '<%= yeoman.dist %>'
}]
}
},
ngAnnotate: {
options: {
singleQuotes: true,
},
all: {
files: {
'.tmp/concat/scripts/scripts.js': ['.tmp/concat/scripts/scripts.js'],
'.tmp/concat/scripts/vendor.js': ['.tmp/concat/scripts/vendor.js']
},
},
},
// Replace Google CDN references
cdnify: {
dist: {
html: ['<%= yeoman.dist %>/*.html']
}
},
// Copies remaining files to places other tasks can use
copy: {
dist: {
files: [{
expand: true,
dot: true,
cwd: '<%= yeoman.app %>',
dest: '<%= yeoman.dist %>',
src: [
'*.{ico,png,txt,json,map}',
'.htaccess',
'*.html',
'views/{,*/}*.html',
'images/{,*/}*.{webp}',
'fonts/*'
]
}, {
expand: true,
cwd: '.tmp/images',
dest: '<%= yeoman.dist %>/images',
src: ['generated/*']
}]
},
styles: {
expand: true,
cwd: '<%= yeoman.app %>/styles',
dest: '.tmp/styles/',
src: '{,*/}*.css'
}
},
// Run some tasks in parallel to speed up the build process
concurrent: {
server: [
'compass:server'
],
test: [
'compass'
],
dist: [
'compass:dist',
'imagemin',
'svgmin'
]
},
// By default, your `index.html`'s <!-- Usemin block --> will take care of
// minification. These next options are pre-configured if you do not wish
// to use the Usemin blocks.
// cssmin: {
// dist: {
// files: {
// '<%= yeoman.dist %>/styles/main.css': [
// '.tmp/styles/{,*/}*.css',
// '<%= yeoman.app %>/styles/{,*/}*.css'
// ]
// }
// }
// },
uglify: {
options: {
sourceMap: '<%= yeoman.dist %>/jalarast.js.map',
sourceMapName: '<%= yeoman.dist %>/jalarast.js.map'
}
},
// dist: {
// files: {
// '<%= yeoman.dist %>/scripts/scripts.js': [
// '<%= yeoman.dist %>/scripts/scripts.js'
// ]
// }
// }
// },
// concat: {
// dist: {}
// },
// Test settings
karma: {
unit: {
configFile: 'karma.conf.js',
singleRun: true
}
}
});
grunt.registerTask('serve', function (target) {
if (target === 'dist') {
return grunt.task.run(['build', 'connect:dist:keepalive']);
}
grunt.task.run([
'clean:server',
'bowerInstall',
'concurrent:server',
'autoprefixer',
'connect:livereload',
'watch'
]);
});
grunt.registerTask('server', function (target) {
grunt.log.warn('The `server` task has been deprecated. Use `grunt serve` to start a server.');
grunt.task.run(['serve:' + target]);
});
grunt.registerTask('test', [
'clean:server',
'concurrent:test',
'autoprefixer',
'connect:test',
'karma'
]);
grunt.registerTask('build', [
'clean:dist',
'bowerInstall',
'useminPrepare',
'concurrent:dist',
'autoprefixer',
'concat',
'ngAnnotate',
'copy:dist',
'cdnify',
'cssmin',
'uglify',
'rev',
'usemin',
'htmlmin'
]);
grunt.registerTask('default', [
'newer:jshint',
'test',
'build'
]);
};
app/index.html:
<!doctype html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]-->
<head>
<meta charset="utf-8">
<title>{{ Page.title() }}</title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width">
<!-- Place favicon.ico and apple-touch-icon.png in the root directory -->
<!-- build:css styles/vendor.css -->
<!-- bower:css -->
<!-- endbower -->
<!-- endbuild -->
<!-- build:css({.tmp,app}) styles/main.css -->
<link rel="stylesheet" href="styles/main.css">
<!-- endbuild -->
</head>
<body ng-app="netnaviApp">
<!--[if lt IE 7]>
<p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
<![endif]-->
<!-- Add your site or application content here -->
<div class="container" ng-include="'views/main.html'" ng-controller="MainCtrl"></div>
<div class="container" ng-include="'views/about.html'" ng-controller="AboutCtrl"></div>
<div class="container" ng-include="'views/faqs.html'" ng-controller="FaqsCtrl"></div>
<div class="container" ng-include="'views/login.html'" ng-controller="LoginCtrl"></div>
<div class="container" ng-include="'views/logout.html'" ng-controller="LogoutCtrl"></div>
<!-- Google Analytics: change UA-XXXXX-X to be your site's ID -->
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-XXXXX-X');
ga('send', 'pageview');
</script>
<!--[if lt IE 9]>
<script src="bower_components/es5-shim/es5-shim.js"></script>
<script src="bower_components/json3/lib/json3.min.js"></script>
<![endif]-->
<!-- build:js scripts/vendor.js -->
<!-- bower:js -->
<script src="bower_components/jquery/dist/jquery.js"></script>
<script src="bower_components/angular/angular.js"></script>
<script src="bower_components/bootstrap-sass-official/vendor/assets/javascripts/bootstrap/affix.js"></script>
<script src="bower_components/bootstrap-sass-official/vendor/assets/javascripts/bootstrap/alert.js"></script>
<script src="bower_components/bootstrap-sass-official/vendor/assets/javascripts/bootstrap/button.js"></script>
<script src="bower_components/bootstrap-sass-official/vendor/assets/javascripts/bootstrap/carousel.js"></script>
<script src="bower_components/bootstrap-sass-official/vendor/assets/javascripts/bootstrap/collapse.js"></script>
<script src="bower_components/bootstrap-sass-official/vendor/assets/javascripts/bootstrap/dropdown.js"></script>
<script src="bower_components/bootstrap-sass-official/vendor/assets/javascripts/bootstrap/tab.js"></script>
<script src="bower_components/bootstrap-sass-official/vendor/assets/javascripts/bootstrap/transition.js"></script>
<script src="bower_components/bootstrap-sass-official/vendor/assets/javascripts/bootstrap/scrollspy.js"></script>
<script src="bower_components/bootstrap-sass-official/vendor/assets/javascripts/bootstrap/modal.js"></script>
<script src="bower_components/bootstrap-sass-official/vendor/assets/javascripts/bootstrap/tooltip.js"></script>
<script src="bower_components/bootstrap-sass-official/vendor/assets/javascripts/bootstrap/popover.js"></script>
<script src="bower_components/angular-route/angular-route.js"></script>
<script src="bower_components/es6-promise/promise.js"></script>
<script src="bower_components/localforage/dist/localforage.min.js"></script>
<script src="bower_components/angular-localforage/dist/angular-localForage.js"></script>
<script src="bower_components/auth0-widget.js/build/auth0-widget.js"></script>
<script src="bower_components/angular-cookies/angular-cookies.js"></script>
<script src="bower_components/auth0.js/build/auth0.js"></script>
<script src="bower_components/auth0-angular/build/auth0-angular.js"></script>
<script src="bower_components/aws-sdk-js/dist/aws-sdk.js"></script>
<script src="bower_components/angular-sanitize/angular-sanitize.js"></script>
<script src="bower_components/pocketsphinx.js-lib/pocketsphinx.js"></script>
<script src="bower_components/pocketsphinx.js-lib/audioRecorder.js"></script>
<script src="bower_components/pocketsphinx.js-lib/audioRecorderWorker.js"></script>
<script src="bower_components/pocketsphinx.js-lib/callbackManager.js"></script>
<script src="bower_components/pocketsphinx.js-lib/recognizer.js"></script>
<script src="bower_components/sdk/index.js"></script>
<script src="bower_components/client/index.js"></script>
<!-- endbower -->
<!-- endbuild -->
<!-- build:js({.tmp,app}) scripts/scripts.js -->
<script src="scripts/app.js"></script>
<script src="scripts/controllers/main.js"></script>
<script src="scripts/controllers/about.js"></script>
<script src="scripts/controllers/faqs.js"></script>
<script src="scripts/controllers/login.js"></script>
<script src="scripts/controllers/logout.js"></script>
<script src="scripts/services/login.js"></script>
<script src="scripts/services/sphinx.js"></script>
<script src="scripts/services/page.js"></script>
<script src="scripts/services/commands.js"></script>
<!-- endbuild -->
</body>
</html>
app/scripts/app.js:
'use strict';
var app = angular.module('jalarastApp', ['ngCookies', 'auth0-redirect', 'ngRoute', 'authInterceptor', 'LocalForageModule']);
app.config(function($localForageProvider, $routeProvider, authProvider, $httpProvider) {
$routeProvider
.when('/', {
templateUrl: 'views/main.html',
controller: 'MainCtrl'
})
.when('/logout', {
templateUrl: 'views/logout.html',
controller: 'LogoutCtrl'
})
.when('/login', {
templateUrl: 'views/login.html',
controller: 'LoginCtrl'
})
.when('/faqs', {
templateUrl: 'views/faqs.html',
controller: 'FaqsCtrl'
})
.when('/about', {
templateUrl: 'views/about.html',
controller: 'AboutCtrl'
});
authProvider.init({
domain: 'donebox.auth0.com',
clientID: '5m4OeON4B753SNC18hjqxASTM9mW25gy',
callbackURL: document.location.href
});
$httpProvider.interceptors.push('authInterceptor');
$localForageProvider.config({
driver : 'localStorageWrapper', // if you want to force a driver
name : 'jalarast', // name of the database and prefix for your data
version : 1.0, // version of the database, you shouldn't have to use this
storeName : 'sessions', // name of the table
description : 'sessions table'
});
});
app.run(function() {
FB.init({
appId : '732206430174952',
status : true,
xfbml : true,
version : 'v2.0',
});
AWS.config.credentials = new AWS.WebIdentityCredentials({
RoleArn: 'arn:aws:iam::<AWS_ACCOUNT_ID>:role/auth0',
ProviderId: 'jalarast.auth0.com',
WebIdentityToken: 'ACCESS_TOKEN'
});
});
My google-fu is failing me here. Could someone please point me in the right direction? THank you for your time and consideration.
EDIT: So I just had a burst of insight into this problem. Look up at my app/scripts/app.js, in the routeProvider. going to /about produces a 404, but /views/about.html returns the page sans formatting, so I'm thinking that the routing mechanism isn't finding my views on the filesystem.
Since you're testing on your friend's MacBook, note that ~/Web
in OSX by default doesn't map to /home/<username>/Web
, but /Users/<username>/Web
. Try changing the value for yeoman.dist
in your Gruntfile
to /Users/levicampbell/Web
.
Otherwise, if /home/levicampbell/Web
exists and Apache is actually using it, verify that your user account has permissions. You could always run sudo grunt build
as a test.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.