Solucionado (ver solução)
Solucionado
(ver solução)
21
respostas

Problemas com os caminhos para o versionamento e minificação (Angular, Grunt)

@EDIT: postei meu problema no GitHub juntamente à um projeto que exemplifica exatamente o meu caso, e também detalhei melhor o problema la.: https://github.com/aldo-jr/teste-versionamento


Olá, boa tarde.

Estou com um problema com a arquitetura do meu projeto para rodar as tasks. Primeiro irei mostrar como está a organização do meu projeto:

Meu Projeto
|
+ Public
|   +- app01
|       +- index.html
|   +- app02
|       +- index.html
|   +- css
|       +- style.min.css
|       +- custom.min.css
|       +- etc.min.css
|   +- js
|       +- lib
|           +- scripts.main.js
|           +- lib.js
|           +- angular.min.js
|   +- index.html

Certo, está é a organização de meu projeto, são 2 aplicações em angular. e os arquivos css's, e js's que são compartilhados em ambas as aplicações ficam fora da pasta do app mas dentro da pasta public do meu projeto.

agora simulando que estou em meu index.html de meu "app01" estou usando os comentarios do usemin com as minhas chamadas dos scripts da seguinte maneira:

        <!-- build:js /js/libs-app.bundle.min.js -->
        <script src="../js/lib/scripts.main.js"></script>
        <script src="../js/lib/lib.js"></script>
        <script src="../js/lib/angular.min.js"></script>
        <!-- endbuild -->

Minha dúvida já começa aqui, se eu usar o comentario com o caminho ../js/...., o é criado uma pasta js FORA da pasta "dist", na raiz geral do meu projeto. e passando /js/... como está sendo feito, é criado certo, até ai tudo bem.

mas o problema é na hora de usar o versionamento, como o caminho do arquivo fica "/js/libs-app.bundle.min.js" ele não encontra o arquivo, creio eu que ele tente procurar em "Meu Projeto/js/libs-app.bundle.min.js" e não encontra, em vez de procurar em "dist/....."

e exatamente o mesmo problema que estou tendo com os scripts (js) estou tendo com as folhas de estilo (css)

o versionamento dos arquivos da index.html da raiz do public funciona:

    <!-- build:css css/login.bundle.min.css -->
    <link rel="stylesheet" href="css/style.min.css">
    <link rel="stylesheet" href="css/custom.min.css">
    <link rel="stylesheet" href="css/etc.min.css">
    <!-- endbuild -->

    <!-- build:js js/libs-login.bundle.min.js -->
    <script src="js/lib/script.main.js"></script>
    <script src="js/lib/lib.js"></script>
    <script src="js/lib/angular.min.js"></script>
    <!-- endbuild -->

Para esta index, eu crio outros arquivos bundle, e eles são criados, minificados e versionados corretamente, o resultado após rodar as tasks é o seguinte:

    <link rel="stylesheet" href="css/494e5e6b.login.bundle.min.css">

    <script src="js/ffc5529b.libs-login.bundle.min.js"></script>

Segue meu initConfig do grunt:

    grunt.initConfig({
        copy: {
            public: {
                expand: true,
                cwd: 'public',
                src: '**',
                dest: 'dist'
            }
        },
        clean: {
            dist: {
                src: ['dist']
            }
        },
        useminPrepare: {
            html: 'dist/**/*.html'
        },
        usemin: {
            html: 'dist/**/*.html'
        },
        imagemin: {
            public: {
                expand: true,
                cwd: 'public/images',
                src: '**/*.{png,jpg,gif}',
                dest: 'dist/images'
            }
        },
        rev: {
            options: {
                encoding: 'utf8',
                algorithm: 'md5',
                length: 8
            },
            imagens: {
                src: ['dist/images/**/*.{png,jpg,gif}']
            },
            minificados: {
                src: ['dist/**/*.bundle.min.js', 'dist/**/*.bundle.min.css']
            }
        }
    });

Caso alguém consiga achar onde estou errando e como poderia fazer para funcionar sem alterar a arquitetura do meu projeto, agradeceria muito!

Obrigado! :)

21 respostas

Cadê o restante do seu script, onde você registra suas taks? Tem que postar o arquivo inteiro, só assim não tem como saber o que há.

    grunt.registerTask('dist', ['clean:dist', 'copy']);
    grunt.registerTask('minifica', ['useminPrepare', 'concat', 'uglify', 'cssmin', 'rev', 'usemin', 'imagemin']);
    grunt.registerTask('default', ['dist', 'minifica']);

    grunt.loadNpmTasks('grunt-contrib-copy');
    grunt.loadNpmTasks('grunt-contrib-clean');
    grunt.loadNpmTasks('grunt-contrib-concat');
    grunt.loadNpmTasks('grunt-contrib-uglify');
    grunt.loadNpmTasks('grunt-contrib-cssmin');
    grunt.loadNpmTasks('grunt-usemin');
    grunt.loadNpmTasks('grunt-contrib-imagemin');
    grunt.loadNpmTasks('grunt-rev');

.

A task rev tem que ser chamada depois do usemin e do useminPrepare.. ou seja.. altere seu código para

grunt.registerTask('minifica', ['useminPrepare', 'concat', 'uglify', 'cssmin', 'usemin', 'imagemin', 'rev']);

usemin e useminPrepare devem ser chamados antes de rev.

edit, resultado a baixo

ainda não funcionou, ele faz certinho o versionamento dos arquivos, ficam com o hash antes, mas no index.html ainda continua:

<link rel="stylesheet" href="/css/app.bundle.min.css">
<script src="/js/libs-app.bundle.min.js"></script>

colocando o 'rev' após o usemin nem o index.html q tenho na raiz que tbm é um app. ficou com o versionamento certo.

colocando o rev onde ele estava antes, o index.html q tenho na raiz do public ele fica versionado certo. O caminho dele eu n coloco "/js/..." É apenas "js/..." pois está na mesma pasta. Acho que o problema deve ser algo nas rotas. Mas não sei como resolver.

irei editar o post principal colocando este index da raíz e a chamada dele.

Olha, eu não sei por que, mas eu já vi algumas vezes o usemin sendo chamado mais de uma vez na mesma task , veja este exemplo:

grunt.registerTask('minify', ['useminPrepare', 'usemin', 'concat', 'uglify', 'cssmin', 'rev', 'usemin', 'imagemin', 'htmlcompressor']);

Teste e veja se funciona

Editei o post principal com o index.html da raiz de meu public, e com os códigos dele. Com ele funciona o versionamento. Então ele está chamando o usemin certo mas por algum motivo ele não deve estar reconhecendo q o /js/... fica dentro da public, parece q ele tenta sair da public e não encontra o arquivo então n altera a chamada dele no html dentro do app. e caso eu deixe nos comentarios o caminho "../js/..." na hora de fazer o bundle, ele cria a pasta js fora da minha pasta dist. @.@

@Douglas Quintanilha Barbosa Ferreira Não funcionou colocando 2 usemin também :/

Irei preparar mais tarde um repositório do github com um projeto com a mesa estrutura que o meu e ver se ocorre o mesmo problema. Em seguida postarei aqui para ficar mais nítido e visível o problema haha, acho que não consegui ser muito claro com o meu impedimento :/ Obrigado.

criei o projetinho para exemplificar o meu problema e ralmente aconteceu a mesma coisa que em meu projeto real.

Postei ele no github, com uma descrição bem detalhada.

Se puderem me ajudar, serei eternamente grato :/ não consigo entender essas rotas do grunt.

Obrigado.

https://github.com/aldo-jr/teste-versionamento

Você reparou o código que o Douglas postou o usemin é chamado duas vezes? Já tentou?

testei com as duas chamadas do usemin também, mas não funcionou, aconteceu a mesma coisa :/

O seu esta assim:

 grunt.registerTask('minifica', ['useminPrepare', 'concat', 'uglify', 'cssmin', 'rev', 'usemin', 'imagemin']);

Tentou assim?

 grunt.registerTask('minifica', ['useminPrepare', 'usemin', 'concat', 'uglify', 'cssmin', 'rev', 'usemin', 'imagemin']);

Parece que há um bug!

https://github.com/yeoman/grunt-usemin/issues/587

Veja uma pessoa com o mesmo problema que o seu. Essa URL é do Django.. do sistema embutido dele. Não deveria aparecer....

http://stackoverflow.com/questions/12219539/signing-in-leads-to-accounts-profile-in-django

Era bug mesmo?

Não consegui uma solução ainda :/ eu estou vendo como funciona estas varíaveis e os plugins do Yeoman, e também como setar o uglify e o cssmin diretamente no gruntfile, talvez isto ajude.

solução!

Aldo. Eu vou fechar o post, mas ele ainda continua sendo visível para outros alunos e moderadores. Eu fiquei intrigado também e a hipótese é que possa ser um bug.

Se conseguir resolver, poste sua solução. Investiguei mais e a ideia de bug se fortaleceu. Minha sugestão final é usar versões mais antigas dos módulos.