13

我在使用 Gruntjs 构建的项目中使用 Restangular。这是一个片段:

// scripts/app.js

angular.module('myApp', ['restangular'])])
  .config(['RestangularProvider', function(RestangularProvider) {

    /* this is different on dev, test, prod environments */
    var baseUrl = 'http://localhost:8080/sms-api/rest/management/';

    RestangularProvider.setBaseUrl(baseUrl);
}])

如果在 cli 中指定,我想有一个不同的值,baseUrl如果没有指定,我想有一个默认值:

$ grunt server
Using default value for 'baseUrl'

$ grunt build --rest.baseUrl='http://my.domain.com/rest/management/'
Using 'http://my.domain.com/rest/management/' for 'baseUrl'

我怎样才能做到这一点?

4

1 回答 1

6

借助Grunt 预处理可以实现,这对于替换文件中的(和其他东西)模板很有用。

首先将其添加到您的.js代码中:

/* Begin insertion of baseUrl by GruntJs */
/* @ifdef baseUrl
 var baseUrl = /* @echo baseUrl */ // @echo ";"
 // @endif */

/* @ifndef baseUrl
 var baseUrl = 'http://www.fallback.url';
 // @endif */
/* End of baseUrl insertion */

然后在你的 grunt 文件中,在安装 grunt preprocess 之后(即npm install grunt-preprocess --save-dev添加以下配置:

 preprocess: {
        options: {
            context: {

            }
        },
        js: {
            src: 'public/js/services.js',
            dest: 'services.js'
        }
    },

显然,您需要根据您使用的文件更新 js 文件列表。重要通知 - 如果您计划更新同一个文件(而不是新目标),您需要使用inline 选项

最后,为了使用 a command line config variable,请将以下自定义任务添加到您的 grunt 文件中:

grunt.registerTask('baseUrl', function () {
        var target = grunt.option('rest.baseUrl') || undefined;
        grunt.log.ok('baseUrl is set to', target);
        grunt.config('preprocess.options.context.baseUrl', target);
        grunt.task.run('preprocess');
    });

最后,像这样运行 baseUrl 任务:

grunt baseUrl --rest.baseUrl='http://some.domain.net/public/whatever'

请注意,我输入了一个备用网址,因此您也可以运行grunt baseUrl,并且 grunt 会将您的 baseUrl 设置为您定义的网址。

于 2013-08-24T10:07:42.913 回答