2017-01-23 120 views
3

我目前正在編寫節點CLI工具並使用webpack捆綁所有資產。此應用程序的入口點是我實際解析process.argv並運行命令(供參考,我使用tj/commander)的js文件。這樣,一旦捆綁完成,我可以輸入./<outputFile>,它將運行我的應用程序。入口文件看起來像這樣:使用webpack輸出可執行文件

import cli from './cli'; 

cli.parse(process.argv); 

// If nothing was supplied 
if (!process.argv.slice(2).length) { 
    cli.outputHelp(); 
} 

捆紮工作正常,但我不能得到的WebPack輸出文件作爲可執行文件。一旦我運行chmod +x <outputFile>,一切正常。有沒有一種方法可以告訴webpack授予輸出文件的權限?

回答

3

一個簡單的方法是使用npm。你的項目中是否有package.json? 將"build": "webpack && chmod +x outputFile"添加到您的package.jsonscripts部分,並通過運行npm run build來構建您的項目。

另一種方法是添加這些解決方案之一的webpack.config.js:從this answer具有prepost建立一個處理程序

  • 使用on-build-webpack plugin,這在年底執行js代碼

    • 簡單的插件的webpack構建過程

    無論你選擇,你將需要添加的代碼,這片:

    var chmod = require('chmod'); 
    chmod("outputFile", 500); 
    
  • +0

    我做的,並沒有考慮說作爲一個選項。如果可能,我想盡可能將它全部放在webpack中。如果沒有人在第二天或第二天發佈特定於webpack的解決方案,我會接受這個答案,因爲它肯定會解決我的問題。 – taylorc93

    0

    雖然@ oklas的解決方案對我來說非常完美,我真的很想嘗試讓這一切的WebPack內。我意識到以後多一點思考,這可能全部由一個非常簡單的插件來完成:

    plugins: [ 
        // ...plugins, 
    
        function() { 
        this.plugin('done',() => { 
         fs.chmodSync('bin/program-name.js', '755'); 
    
         // When the webpack output doesn't have a .js extension, minification fails :(
         fs.renameSync('bin/program-name.js', 'bin/program-name'); 
        }) 
        }, 
    ] 
    

    使用哪種方法適合您的需要!

    2

    您需要在文件頂部追加#!/usr/bin/env node
    我結束了使用shelljs

    plugins: [ 
        // ...plugins, 
        function() { 
         this.plugin('done',() => { 
         shell 
         .echo('#!/usr/bin/env node\n') 
         .cat(`${__dirname}/build/outputfile.js`) 
         .to(`${__dirname}/commandname`) 
         shell.chmod(755, `${__dirname}/commandname`) 
        }) 
        }, 
    ] 
    
    0

    我很驚訝,沒有人說約的WebPack的BannerPlugin這事插件的WebPack。我做的比@oklas類似的東西,但使用BannerPlugin添加特定節點家當:

    { 
        plugins: [ 
        new webpack.BannerPlugin({ 
         banner: '#!/usr/bin/env node', 
         raw: true, 
        }), 
        ], 
    } 
    

    然後,我只是簡單地添加chmod執行權限添加到我的package.json文件:

    "scripts": { 
        "build": "webpack && chmod +x dist/mycommand" 
    } 
    

    順便說一句,如果你如果您想使用webpack,您可以使用WebpackShellPlugin,正如oklas所說(請注意,使用此功能會強制您添加新的依賴項,這就是爲什麼我避免使用此方法的原因):

    const WebpackShellPlugin = require('webpack-shell-plugin') 
    { 
        // [...] 
        plugins: [ 
        new WebpackShellPlugin({ 
         onBuildEnd:['chmod +x dist/mycommand'], 
        }), 
        ], 
    } 
    

    如果你想避免包括WebpackShellPlugin的依賴,你可以嘗試定義基於fs一個自定義插件,如@taylorc93

    相關問題