Bir node.js uygulamasından exe dosyaları nasıl oluşturulur?


123

Yazdığım ve aşağıdaki gibi çalıştırdığım bir düğüm uygulamam var:

node.exe app.js inputArg

Bunu kendi başına bir .exe olarak paketlememin bir yolu var mı? Yani böyle bir şey yapabilir miyim?

App.exe inputArg

Bunu bir toplu iş dosyası kullanarak taklit etmenin bir yolu var, bu yüzden bunu yapabilirim:

App.bat inputArg

Ancak bu, o klasördeki tüm bağımlılıklara ve düğüme sahip olmam gerektirir ki bu ideal değildir.




İyi bir araç listesi burada: stackoverflow.com/a/12486874/32679
GrGr

1
Sanırım buraya cevap ekleyen herhangi birinin gerçekten yapılıp yapılmadığını düşünmesi gerekiyor. Bu soru, değişen kalite / faaliyete sahip çeşitli açık kaynaklı ürünlere bağlantı yığınına dönüşüyor.
Liam

Yanıtlar:


35

Hem ücretsiz hem de ticari birkaç alternatif var. Hiçbirini kullanmadım ama teoride işe yaramalılar:

Çoğu, toplu iş dosyasını ana yürütülebilir dosya olarak tutmanızı ve ardından node.exe'yi ve komut dosyalarınızı paketlemenizi gerektirir.

Komut dosyanıza bağlı olarak, onu yalnızca kaynak ekleyerek çalıştırılabilir dosyalar oluşturmanın kolay bir yolunu destekleyen JSDB'ye taşıma seçeneğiniz de vardır .

Üçüncü bir yarı çözüm, düğümü benzer bir yerde tutmak C:\utilsve bu klasörü PATHortam değişkeninize eklemektir . Daha sonra bu dizinde node + tercih ettiğiniz betikleri çalıştıran .bat dosyaları yaratabilirsiniz - coffeebu şekilde coffeescript'in çalışmasını sağladım . Bu kurulum bir toplu iş dosyası, vb komut dosyası veya yükleyici ile otomatikleştirilebilir.


Bunlar iyi görünüyor ve benim istediklerimi yapabilecek gibi görünüyorlar. Bir şans vereceğim ve size geri döneceğim.
Aishwar

2
"Advanced" Batch To EXE dönüştürücüsünü denedim ve harika çalıştı. Bağımlılıkları EXE dosyasında paketleyebilirsiniz. Yardım için teşekkürler.
Aishwar

1
@Aishwar, ancak node_modules klasörünü paketleyemezsiniz, bu nedenle içinde gelişmiş hiçbir şey yapamazsınız ...
Clint

Ya zip / rar node_modules yaparsanız ve uygulama çalıştığında bir geçici dizine çıkartırsanız? Yine de çok sayıda modülünüz varsa biraz yavaşlayabilir.
Jarrod Mosen

55

Kullandığım çözüm Roger Wang'ın node-webkit'i .

Bu, nodejs uygulamalarını paketlemenin ve dağıtmanın harika bir yoludur, hatta size tüm uygulamayı tek bir yürütülebilir dosya olarak "gruplama" seçeneği sunar. Windows, mac ve linux'u destekler.

Düğüm webkit uygulamalarını dağıtmak için çeşitli seçeneklerle ilgili bazı belgeler aşağıda verilmiştir , ancak kısaca şunları yaparsınız:

  1. Tüm dosyalarınızı kök dizininde package.json ile sıkıştırın
  2. Uzantıyı .zip'den .nw'ye değiştirin
  3. kopyala / b nw.exe + app.nw app.exe

Ek bir not olarak - bunu kullanarak birkaç üretim kutusu / yükleme cd uygulaması gönderdim ve harika çalıştı. Aynı uygulama windows, mac, linux ve web üzerinden çalışır.

Güncelleme: proje adı 'nw.js' olarak değiştirildi ve burada düzgün bir şekilde bulunuyor: nw.js


1
Sadece denedim, harika çalıştı! Ve Intel'deki kişiler tarafından destekleniyor.
Timo Huovinen

Bu, bugün itibariyle en doğru ve en güncel cevap olmalıdır. Ayrıca buradaki düğüm webkit hile sayfasına bakın: gist.github.com/LeCoupa/80eca2716a2b13c37cce JS'yi nasıl derleyeceğiniz (veya en azından kelime hakkında ne kadar eski moda olmak istediğinize bağlı olarak en azından bayt koduna indirgeme) gibi diğer yoğun yararlı şeyleri içerir. ) "derlemek".
Erik Reppen

Bu yanıtı beğendim, ancak bu yine de bağımsız bir exe oluşturmuyor. Github'daki Intel ve nw.js'ye göre , aynı klasörde en az iki dosya daha olması gerekir: nw.pak ve icudt.dll. Bağımsız bir exe'yi nasıl yaratırsınız?
Jeff Baker

@JeffBaker, github'daki belgelerde biraz aşağıya bakarsanız, şunu görebilirsiniz: github.com/nwjs/nw.js/wiki/… , ek dosyalar eklemek istemiyorsanız bunu yapabilirsiniz.
Clayton Gulick

@Clayton, Nw.js de chrome.com tarafından kontrol ediliyor. developer.chrome.com/apps/migration#native
Pacerier

29

Bu soruyla karşılaşan herkes için, artık düğüm projelerinizden exes oluşturan iki proje var, Pkg ve Electron.atom.io , biraz farklılar:

  1. Pkg , projenizi yerel koda göre derler, ayrıca varlıklar VE bir nodejs kurulumu içerir (sistemin .exe'yi yürütmek için nodej'leri yüklemesine gerek yoktur). Kaynak kodunuz dahil edilmeyecektir. Ortaya çıkan yürütülebilir dosya YALNIZCA Windows'tur (.exe). Artık tüm platformlar destekleniyor. Artık ticari ürünler için bir lisans gerektiriyor. Tamamen açık kaynak.
  2. Electron.atom.io sizin için sıkıştırıp bir .exe oluşturmazken, uygulamaları dağıtmak için bir yol sundukları için nodejs uygulamalarını dağıtmak için kullanılabilir . Avantajları, elektronun çoklu platform (windows, mac osx, linux) olmasıdır, eksileri, uygulamanızı bir asar arşivi içinde dağıtmanın bir yolunu sunsalar bile, kaynak kodunuzun dahil edilecek olmasıdır . Kurşun geçirmez olmayacak ama yine de kaynağınızdan daha iyi.

2
Lütfen güncelleyin: EncloseJS artık Linux ve OS X'i destekliyor.
000000000000000000000

Yorum düzenlendi! @ 000000000000000000000
sokie

EncloseJS gitmenin yoludur. Ben şimdi deneyeceğim! Cevabınızı eklediğiniz için teşekkürler! +1 :)
tftd

EncloseJS'yi yükleyemiyorum. Herhangi bir yararlı hata mesajı olmadan Err kodu ELIFECYCLE diyor.
Elmue

2
EncloseJS artık korunmuyor. Varis zeit / pkg ( npmjs.com/package/pkg ) gibi görünüyor
Lucas Gonze

21

Varsayılan olarak Windows, .jsdosyaları Microsoft'un bağımsız JS çalışma zamanı motoru olan Windows Komut Dosyası Ana Bilgisayarı ile ilişkilendirir . Komut istemine script.js yazarsanız (veya .jsExplorer'da bir dosyaya çift ​​tıklarsanız ), komut dosyası tarafından çalıştırılır wscript.exe.

Bu, genel bir ayar ile yerel bir sorunu çözüyor olabilir , ancak dosyaları şununla ilişkilendirebilirsiniz: .jsnode.exe çözüyor bunun yerine , böylece komut isteminde script.js yazmak veya öğeleri komut dosyalarına çift tıklamak / sürüklemek onları Düğüm ile başlatacaktır.

Tabii ki, eğer benim gibi .jsdosyaları bir düzenleyiciyle ilişkilendirdiyseniz , böylece onlara çift tıkladığınızda en sevdiğiniz metin düzenleyiciyi açarsanız , bu öneri pek bir işe yaramayacaktır. Ayrıca dosyalara "Düğümle Yürüt" sağ tıklama menüsü girişi de ekleyebilirsiniz.js , ancak bu alternatif komut satırı ihtiyaçlarınızı çözmez.


En basit çözüm, muhtemelen yalnızca bir toplu iş dosyası kullanmaktır - komut dosyanızın bulunduğu klasörde Düğümün bir kopyasına sahip olmanız gerekmez. Yalnızca çalıştırılabilir Düğüme kesinlikle başvurun:

"C:\Program Files (x86)\nodejs\node.exe" app.js %*

Başka bir alternatif, Node'u .jsçalıştırılacak komut dosyası olarak kendi dosya adını + kullanarak başlatacak ve komut satırı argümanlarını iletecek olan bu çok basit C # uygulamasıdır .

class Program
{
    static void Main(string[] args)
    {
        var info = System.Diagnostics.Process.GetCurrentProcess();
        var proc = new System.Diagnostics.ProcessStartInfo(@"C:\Program Files (x86)\nodejs\node.exe", "\"" + info.ProcessName + ".js\" " + String.Join(" ", args));
        proc.UseShellExecute = false;
        System.Diagnostics.Process.Start(proc);
    }
}

Sonuç olarak ortaya çıkan EXE dosyasını "app.exe" olarak adlandırırsanız, yazabilirsiniz app arg1 ...ve Node komut satırıyla başlatılır "app.js" arg1 .... C # bootstrapper uygulamasının hemen çıkacağını ve Node'un konsol penceresinden sorumlu kalacağını unutmayın.

Bu muhtemelen nispeten geniş bir ilgi alanı olduğu için, devam ettim ve bunu GitHub'da kullanıma sundum , eğer yabancılarla minibüslere girmek senin işinse derlenmiş exe dahil .


Bahsettiğiniz gibi, bu benim sorunumu ideal bir şekilde çözmüyor. Ancak ilginç okumalar için +1
Aishwar

@Aishwar, sizin için Node'u başlatacak basit bir uygulama ekledim. Düzenlemeleri görün.
josh3736

@ josh3736 sizin exe hala aynı klasörde node.exe olmasını gerektiriyor mu?
Ricardo Tomasi

@RicardoTomasi, hayır. Düğümün sisteminizin Program Dosyaları dizinine (yükleyicinin koyduğu yere) kurulu olduğunu varsayar.
josh3736

@ josh3736 Bu ilginç bir çözüm. Yaptıklarınızı beğendim, keşke tekrar + 1'leyebilseydim :). Ancak bu, kullanıcının node.js'nin kurulu ve standart yolda olmasını gerektirdiğinden yine de ideal değildir.
Aishwar

20

Bildiğim en iyi araç NodeJS aracı: zeit / pkg

Kullanımı çok kolaydır (örnek olarak Nexe'den çok daha fazlası), sadece global olarak kurabilirsiniz: npm install -g pkg

macOS, Linux ve Windows için yürütülebilir dosyalar oluşturmak için:

pkg exampleApp.js

NodeJS soket sunucusunu kullanan biraz karmaşık bir kodum vardı, farklı uygulamalar denedim, hiçbiri onu düzgün oluşturmadı, zeit / pkg dışında .


Bir Appium kurulumunu bir Exe dosyasına sıkıştırmaya çalıştım ve zeit / pkg tamamen başarısız oldu. Diskteki 310MB'den 18MB'lık küçük bir Exe dosyası ortaya çıktı ve bu açıkça hiç çalışmadı.
Elmue


12

Bu soru cevaplandığı için başka bir çözüm başlatıldı.

https://github.com/appjs/appjs

Bu yazının yazıldığı sırada, bu, node.js uygulamalarını bir yürütülebilir dosyada derlenen soyulmuş bir krom paketi aracılığıyla paketlemeye yönelik her şeyin sonundaki çözümdür.

Düzenleme: AppJS artık aktif değil, ancak kendisi masa kabuğu adı verilen bir çatal önermektedir.

https://github.com/sihorton/appjs-deskshell/


1
Kırık bir bağlantı gibi görünüyor.
starbeamrainbowlabs

1
Bu proje artık aktif değil. Clayton Gulick tarafından belirtildiği gibi bir alternatif için düğüm webkit'e bakın.
Kukks


11

Burada birçok iyi cevap var, ancak hepsi JXcore kadar basit değil .

JXcore'u Windows'a yükledikten sonra yapmanız gereken tek şey çalıştırmaktır:

jx package app.js "myAppName" -native

Bu, dağıtabileceğiniz ve herhangi bir harici bağımlılık olmadan çalıştırabileceğiniz bir .exe dosyası oluşturacaktır (sistemde JXcore veya Node.js'ye bile ihtiyacınız yoktur).

İşte bu işlevsellikle ilgili belgeler: http://jxcore.com/packaging-code-protection/#cat-74

2018'i Düzenle

Bu proje artık öldü, ancak hala burada barındırılıyor: https://github.com/jxcore/jxcore-release (teşekkürler @Elmue)


1
Teşekkürler dostum. Windows'tan bir linux çalıştırılabilir yapabilir miyim?
Sasivarnan

1
Bildiğim kadarıyla hayır, yapamazsın. Bence JXCore, çalıştırılabilir yapmak için işletim sisteminden bazı dosyalar alıyor ve bu dosyaları paketlemiyor, bu nedenle bir Linux çalıştırılabilir yapmak istiyorsanız, bu komutu Linux'ta çalıştırmanız gerekecek.
Nepoxx


1
Buradaki tüm bağlantılar kesildi. Bu çalışır: github.com/jxcore/jxcore-release
Elmue

7

Deneyin disclose: https://github.com/pmq20/disclose

disclose Node.js projenizden ve Node.js yorumlayıcınızdan aşağıdaki özelliklere sahip kendi kendine ayıklanan bir exe oluşturur,

  1. GUI yok. Saf CLI.
  2. Çalışma zamanı bağımlılığı yok
  3. Hem Windows hem de Unix'i destekler
  4. İlk kez yavaş çalışır (bir önbellek dizinine çıkarılır), sonra sonsuza kadar hızlı çalışır

Deneyin node-compiler: https://github.com/pmq20/node-compiler

node-compilerNode.js projenizi tek bir yürütülebilir dosyada derlemek için çağrılan yeni bir proje yaptım .

discloseKaynak kodunuz, standart Node.js kitaplıkları gibi Node.js yorumlayıcısı ile birlikte derlendiğinden, ilk seferinde asla yavaş çalışmamasından daha iyidir .

Ek olarak, dosya ve dizin isteklerini çalışma zamanında dosya sistemi yerine belleğe şeffaf bir şekilde yeniden yönlendirir. Böylece derlenen ürünü çalıştırmak için kaynak kodu gerekmez.

Nasıl çalışır: https://speakerdeck.com/pmq20/node-dot-js-compiler-compiling-your-node-dot-js-application-into-a-single-executable

Benzer Projelerle Karşılaştırma,

  • pkg ( https://github.com/zeit/pkg ): Pkg saldırıya uğramış fs. * API'ler paket içi dosyalara erişmek için dinamik olarak, Node.js Derleyici ise onları tek başına bırakıp bunun yerine libsquash aracılığıyla daha derin bir seviyede çalışır. Pkg, paket içi dosyaları depolamak için JSON kullanırken, Node.js Compiler, veri yapısı olarak daha karmaşık ve yaygın olarak kullanılan SquashFS'yi kullanır.

  • EncloseJS ( http://enclosejs.com/ ): EncloseJS, paket içi dosyalara erişimi yalnızca beş fs. * API ile sınırlarken, Node.js Derleyici tüm fs. * API'leri destekler. EncloseJS, tescilli lisanslıdır ve kullanıldığında ücret alırken, Node.js Compiler MIT lisanslıdır ve kullanıcılar bunu kullanmakta ve değiştirmekte özgürdür.

  • Nexe ( https://github.com/nexe/nexe ): Nexe, browsererify kullanımı nedeniyle dinamik gereksinimi desteklemez, oysa Node.js Compiler, require.resolve dahil olmak üzere her türlü gereksinimi destekler.

  • asar ( https://github.com/electron/asar ): Asar, dosyaların bilgilerini depolamak için JSON'u kullanırken, Node.js Derleyici SquashFS'yi kullanır. Asar, kod arşivini ve yürütülebilir dosyayı ayrı tutarken, Node.js Derleyici, tüm JavaScript kaynak kodunu Node.js sanal makinesiyle bağlar ve son ürün olarak tek bir yürütülebilir dosya oluşturur.

  • AppImage ( http://appimage.org/ ): AppImage, yalnızca SquashFS'yi destekleyen bir çekirdeğe sahip Linux'u desteklerken, Node.js Derleyici, çekirdekten herhangi bir özel özellik gereksinimi olmadan, Linux, macOS ve Windows'un üç platformunu da destekler.


@ StéphaneLaurent Düğüm derleyicisine bakın, exe ile bir komut satırı argümanının kullanılmasını kesinlikle destekler.
Minqi Pan

En son taahhüt 30 Ağustos 2017 (2 yıl önce). Durdurulan ?!
Thach Lockevn

4

Bunun için size BoxedApp'ı tavsiye ediyorum. Çok iyi çalışan ticari bir üründür. Herhangi bir NodeJS uygulaması için çalışır. Son kullanıcı, uygulamanız için yalnızca bir EXE dosyası alır. Kuruluma gerek yok.

Örneğin Electron'da, son kullanıcının uygulamanızı yüklemesi / sıkıştırmasını açması gerekir ve kodunuzun tüm kaynak dosyalarını görecektir.

BoxedApp NodeJS uygulamanızın ihtiyaç duyduğu tüm dosyaları ve bağımlılıkları paketler. Sıkıştırmaları destekler ve derlenen dosya Windows XP +

Bunu kullandığınızda, derlenen uygulamaya Node.EXE eklediğinizden emin olun. Windows XP'yi destekleyen bir düğüm sürümü seçin (buna ihtiyacınız varsa)

Program komut satırı argümanlarını destekler, yani paketten sonra şunları yapabilirsiniz:

c:\myApp argument1

Ve düğüm kodunuzdaki argümanı alabilirsiniz:

process.argv[1]

Bazen uygulamanızın dosya bağımlılıkları vardır, bu nedenle BoxedApp'ta herhangi bir klasör ve dosyayı bağımlılık olarak ekleyebilirsiniz, örneğin bir ayarlar dosyası ekleyebilirsiniz.

var mySettings=require('fs').readFileSync('./settings.jgon').toString()

Daha fazla bilgi:

Sadece bir not: genellikle açık kaynak / özgür yazılım hakkında tavsiyede bulunuyorum, ancak bu durumda işi bitiren hiçbir şey bulamadım.


1
Aynı zamanda iyi kod korumasını da destekler, çünkü veriler RAM'in içine kaydedilip Sabit Sürücüye kaydedilmez
z0r1fan


3

Bu konuyu birkaç gündür araştırıyorum ve bulduğum şey işte burada. Seçenekler iki kategoriye ayrılır:

Bir masaüstü uygulaması oluşturmak istiyorsanız en iyi seçenekler şunlardır:

1- NW.js : tüm Node.js modüllerini doğrudan DOM'dan çağırmanıza ve tüm Web teknolojileriyle uygulamaları yazmanın yeni bir yolunu etkinleştirmenize olanak tanır.

2- Electron : JavaScript, HTML ve CSS ile platformlar arası masaüstü uygulamaları oluşturun

İşte aralarında iyi bir karşılaştırma: NW.js ve Electron Karşılaştırıldı . Bence NW.js daha iyi ve aynı zamanda JS dosyalarını derlemek için bir uygulama sağlıyor. Ayrıca Enigma Virtual Box gibi bazı bağımsız çalıştırılabilir ve yükleyici oluşturucular da vardır . Her ikisi de sunucu uygulamaları için gereksiz olan gömülü bir Chrome sürümü içerir.

Bir sunucu uygulamasını paketlemek istiyorsanız, bunlar en iyi seçeneklerdir:

node-compiler : Ahead-of-time (AOT) Derleyici Node.js için tasarlanmıştır, bu sadece çalışır.

Nexe : node.js uygulamalarınızdan tek bir yürütülebilir dosya oluşturun

Bu kategoride, dinamik gereksinim ve yerel düğüm modüllerini destekleyen düğüm derleyicisinin daha iyi olduğuna inanıyorum. Kullanımı çok kolaydır ve çıktı 25MB'den başlar. Node Compiler sayfasında diğer çözümlerle tam bir karşılaştırmayı okuyabilirsiniz. Nexe hakkında pek bir şey okumadım, ancak şimdilik, Node Compiler, V8 anlık görüntü özelliğini kullanarak js dosyasını ikili formatta derlemiyor gibi görünüyor, ancak sürüm 2 için planlanıyor. Ayrıca yerleşik yükleyici oluşturucuya sahip olacak.


2
ElectronOP'nin konusu için geçerli bir öneri olduğunu haklı çıkarmaz; tamamen farklı bir Node çerçevesidir.
progyammer

Harika karşılaştırma!
Vlad


1

Komut isteminden kazanmaya başlamaktan yoruldum, sonra bununla da karşılaştım. Biraz geliştirilmiş ver. ne josh3736 üzerinde . Bu, birkaç ayarı almak için bir XML dosyası kullanır. Örneğin Node.exe, dosyanın yolu ve varsayılan app.js'de başlatılacak dosya gibi. Ayrıca app.js'nizde (veya server.js'de veya adını verdiğiniz her ne ise) belirttiğiniz yüklenecek ortam (üretim, geliştirme vb.). Esasen NODE_ENV={0}, sizin için bir değişken olarak app.js'de yapılandırmanızın adı {0} olduğunu ekler . Bunu config.xml'deki "mode" öğesini değiştirerek yaparsınız. Projeyi buradan alabilirsiniz ==> github . Derleme Sonrası olaylarında, config.xml dosyanızı ve yürütülebilir dosyayı otomatik olarak kopyalamak için kopyalama yollarını değiştirebileceğinizi unutmayın.Nodejsdizin, sadece bir adımı kaydetmek için. Aksi takdirde bunları düzenleyin, aksi takdirde yapınız bir uyarı verir.

var startInfo = new ProcessStartInfo();
        startInfo.FileName = nodepath;
        startInfo.Arguments = apppath;
        startInfo.UseShellExecute = false;
        startInfo.CreateNoWindow = false;
        startInfo.WindowStyle = ProcessWindowStyle.Hidden;

        if(env.Length > 0)
            startInfo.EnvironmentVariables.Add("NODE_ENV", env);

        try
        {
            using (Process p = Process.Start(startInfo))
            {
                p.WaitForExit();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message.ToString(), "Start Error", MessageBoxButtons.OK);
        }


0

Nodebob adında bir açık kaynak oluşturma aracı projesi var . Çalışma platformu pencerelerinin,

  1. basitçe klonlayın veya projeyi indirin
  2. tüm node-webkit proje dosyalarınızı uygulama klasörüne kopyalayın.
  3. build.bat komut dosyasını çalıştırın.

Yürütülebilir dosyayı sürüm klasörünün içinde bulacaksınız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.