2010-06-01 105 views
34

在Windows下使用Strawberry Perl将简单Perl脚本编译为可执行文件最简单的方法是什么?(据我所知,这可能是免费的)?如何使用Strawberry Perl将Perl脚本编译为Windows可执行文件?

以前我用过ActiveState编译器和perl2exe,很简单。但是,现在经过几次计算机更改和操作系统更新,我失去了许可证,我希望找到更好的/永久的解决方案。

+0

愚弄http://stackoverflow.com/questions/1237286和http://stackoverflow.com/questions/446685 – daxim 2010-06-01 09:09:22

+0

可能[如何在不安装解释器的情况下部署Perl/Python/Ruby脚本?](http://stackoverflow.com/questions/446685/how-can-i-deploy-a-perl-python-ruby-script -without-installation-an-interpreter) – 2010-12-28 19:02:35

回答

27

安装PAR::Packer from CPAN (it is free)并使用pp工具。

+2

使用说明:http://n3ncy.com/PERL/和here:http://stackoverflow.com/questions/1237286/how-can-i-compile-my-perl-脚本那么它可任意被执行的上的系统,而无需-perl的入/ 124137 9#1241379 – Notitze 2010-06-01 10:45:03

+4

注意:PAR :: Packer/pp附带手册:http://search.cpan.org/perldoc?pp要深入了解您可以用PAR做什么,请查看我的来自YAPC :: EU 2008的讲话http://steffen-mueller.net/talks/appdeployment/ – tsee 2010-06-01 16:13:38

+0

这似乎不适用于我http://stackoverflow.com/questions/9588100/installing-parpacker-on-windows -dmake-error-255 – 2012-03-06 17:24:50

5

有三种包装商,以及两种编译器:

免费打包:PAR
商业包装商:perl2exe,perlapp
编译器:B :: C,B :: CC

http://search.cpan.org/dist/B-C/perlcompile.pod

(注:perlfaq3仍然是错误的)

对于你的草莓因为B-C-1.42不支持5.16,所以需要来自git master(1.43)的perl-5.16和B-C。

1

这是一步一步的例子,它使用草莓,它的工作原理! 它基于的ExtUtils ::嵌入模块和perlembed文档

http://perl-node-interface.blogspot.com/2011/03/deploy-perl-application-on-windows.html

+2

注意:本示例使用ExtUtils :: Embed。我试图按照说明操作,但并不是所有文件都在示例中完全显示,我无法完成这项工作。相比之下,使用PAR :: Packer的“pp”示例非常非常简单,并且首次运行。根据我的经验,我不得不推荐PAR :: Packer和pp。 – 2012-01-16 00:23:20

13
:: short answer : 
    :: perl -MCPAN -e "install PAR::Packer" 
    pp -o <<DesiredExeName>>.exe <<MyFancyPerlScript>> 

    :: long answer - create the following cmd , adjust vars to your taste ... 
    :: next_line_is_templatized 
    :: file:compile-morphus.1.2.3.dev.ysg.cmd v1.0.0 
    :: disable the echo 
    @echo off 

    :: this is part of the name of the file - not used 
    set _Action=run 

    :: the name of the Product next_line_is_templatized 
    set _ProductName=morphus 

    :: the version of the current Product next_line_is_templatized 
    set _ProductVersion=1.2.3 

    :: could be dev , test , dev , prod next_line_is_templatized 
    set _ProductType=dev 

    :: who owns this Product/environment next_line_is_templatized 
    set _ProductOwner=ysg 

    :: identifies an instance of the tool (new instance for this version could be created by simply changing the owner) 
    set _EnvironmentName=%_ProductName%.%_ProductVersion%.%_ProductType%.%_ProductOwner% 

    :: go the run dir 
    cd %~dp0 

    :: do 4 times going up 
    for /L %%i in (1,1,5) do pushd .. 

    :: The BaseDir is 4 dirs up than the run dir 
    set _ProductBaseDir=%CD% 
    :: debug echo BEFORE _ProductBaseDir is %_ProductBaseDir% 
    :: remove the trailing \ 

    IF %_ProductBaseDir:~-1%==\ SET _ProductBaseDir=%_ProductBaseDir:~0,-1% 
    :: debug echo AFTER _ProductBaseDir is %_ProductBaseDir% 
    :: debug pause 


    :: The version directory of the Product 
    set _ProductVersionDir=%_ProductBaseDir%\%_ProductName%\%_EnvironmentName% 

    :: the dir under which all the perl scripts are placed 
    set _ProductVersionPerlDir=%_ProductVersionDir%\sfw\perl 

    :: The Perl script performing all the tasks 
    set _PerlScript=%_ProductVersionPerlDir%\%_Action%_%_ProductName%.pl 

    :: where the log events are stored 
    set _RunLog=%_ProductVersionDir%\data\log\compile-%_ProductName%.cmd.log 

    :: define a favorite editor 
    set _MyEditor=textpad 

    ECHO Check the variables 
    set _ 
    :: debug PAUSE 
    :: truncate the run log 
    echo date is %date% time is %time% > %_RunLog% 


    :: uncomment this to debug all the vars 
    :: debug set >> %_RunLog% 

    :: for each perl pm and or pl file to check syntax and with output to logs 
    for /f %%i in ('dir %_ProductVersionPerlDir%\*.pl /s /b /a-d') do echo %%i >> %_RunLog%&perl -wc %%i | tee -a %_RunLog% 2>&1 


    :: for each perl pm and or pl file to check syntax and with output to logs 
    for /f %%i in ('dir %_ProductVersionPerlDir%\*.pm /s /b /a-d') do echo %%i >> %_RunLog%&perl -wc %%i | tee -a %_RunLog% 2>&1 

    :: now open the run log 
    cmd /c start /max %_MyEditor% %_RunLog% 


    :: this is the call without debugging 
    :: old 
    echo CFPoint1 OK The run cmd script %0 is executed >> %_RunLog% 
    echo CFPoint2 OK compile the exe file STDOUT and STDERR to a single _RunLog file >> %_RunLog% 
    cd %_ProductVersionPerlDir% 

    pp -o %_Action%_%_ProductName%.exe %_PerlScript% | tee -a %_RunLog% 2>&1 

    :: open the run log 
    cmd /c start /max %_MyEditor% %_RunLog% 

    :: uncomment this line to wait for 5 seconds 
    :: ping localhost -n 5 

    :: uncomment this line to see what is happening 
    :: PAUSE 

    :: 
    ::::::: 
    :: Purpose: 
    :: To compile every *.pl file into *.exe file under a folder 
    ::::::: 
    :: Requirements : 
    :: perl , pp , win gnu utils tee 
    :: perl -MCPAN -e "install PAR::Packer" 
    :: text editor supporting <<textEditor>> <<FileNameToOpen>> cmd call syntax 
    ::::::: 
    :: VersionHistory 
    :: 1.0.0 --- 2012-06-23 12:05:45 --- ysg --- Initial creation from run_morphus.cmd 
    ::::::: 
    :: eof file:compile-morphus.1.2.3.dev.ysg.cmd v1.0.0 
+1

这是什么语法? – 2012-06-23 11:57:56

+0

windows cmd/batch – 2012-06-23 14:17:04