Вопрос

Я настроил локальную веб-среду Perl на своем компьютере с Windows.Приложение, над которым я работаю, изначально создано на сервере Linux, поэтому исходный код .pl файлы выглядят так:

#!/usr/bin/perl

Это вызывает следующую ошибку на моей машине для разработчиков Windows:

(OS 2)The system cannot find the file specified.

Можно ли изменить мою конфигурацию Apache 2, чтобы шебанг игнорировался на моем компьютере с Windows?Конечно, я мог бы установить #!c:\perl\bin\perl.exe, это очевидно;но проблема заключается в развертывании обновленных файлов.Очевидно, что было бы очень неудобно менять это значение при каждом развертывании.Я использую АктивПерл на Виндовс 7.

Обновлять:

Я должен был упомянуть, что мне нужно сохранить шебанг, чтобы сценарии работали на нашем рабочем сервере Linux с общим хостингом.Если бы у меня не было этого ограничения и мне не пришлось бы использовать шебанг, очевидным ответом было бы просто не использовать его.

Это было полезно?

Решение

я использую #!/usr/bin/perl в моих сценариях и настройте Apache в Windows, чтобы он игнорировал строку shebang.Добавлять

 ScriptInterpreterSource Registry-Strict

на ваш httpd.conf и настройте ключ реестра Windows, как описано в Документы Apache.

Вот что я получаю, когда экспортирую ключ:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.pl\Shell\ExecCGI\Command]
@="c:\\opt\\perl\\bin\\perl.exe"

Я использовал эту настройку с Apache и ActiveState Perl на своем ноутбуке с Windows, а также с дистрибутивами Apache и Perl, поставляемыми с ArchLinux, на моем сервере.

Документы Apache (на которые я дал ссылку выше) гласят:

Опция Registry-Strict, новая в Apache 2.0, делает то же самое, что и Registry, но использует только подраздел. Shell\ExecCGI\Command. А ExecCGI ключ не общий.Его необходимо настроить вручную в реестре Windows и, следовательно, предотвратить случайные вызовы программ в вашей системе..(выделено мной)

Другие советы

Портативной лески Shebang не существует.Даже на той же платформе и архитектуре кто-то мог установить Perl в другом месте.

Хитрость в том, чтобы не устанавливать модули и скрипты вручную.Когда вы упаковываете все как дистрибутивы и используете инструментальную цепочку модулей, строки shebang автоматически изменяются, чтобы указывать на Perl, который вы использовали для установки всего.Вам не придется думать об этих деталях.:)

Я использую #! /usr/bin/env perl как шебанг на всех моих Perl, будь то *nix или Windows.Windows просто игнорирует это, и Unixen следует за env к выбранному дистрибутиву Perl.

У меня это работало так: скопировать perl.exe в c:/usr/bin/ и переименовать его в perl (удалить .exe)

В Win7 и более поздних версиях это также можно сделать с помощью команды mklink «dos».

Запустите оболочку cmd от имени администратора и сделайте что-то вроде следующего:

mklink /d c:\usr c:\Perl       # Activestate perl in c:\Perl\bin\perl.exe
mklink /d c:\usr c:\xampp\perl # Xampp perl in c:\xampp\perl\bin\perl.exe

У меня нет под рукой Windows, но perlcritic говорит:

my $desc = q{Found platform-specific perl shebang line};
my $expl = q{Perl source in parrot should use the platform-independent shebang line: #! perl};

Так что я думаю #! perl должно сработать.

Редактировать:не работает в Linux;видимо работает в parrot, хотя я не понимаю, как им это удается.

  1. Установить любой вариант Windows Bash (например, Cygwin, MSYS2 или GnuWin32);
  2. Создайте тривиальный сценарий оболочки перенаправления:

    exec "@"
    
  3. Создайте запись в реестре:

    Windows Registry Editor Version 5.00
    
    [HKEY_CLASSES_ROOT\.cgi\Shell\ExecCGI\Command]
    @="<path-to-sh> <path-to-script>"
    
    [HKEY_CLASSES_ROOT\.pl\Shell\ExecCGI\Command]
    @="<path-to-sh> <path-to-script>"
    
    [HKEY_CLASSES_ROOT\.py\Shell\ExecCGI\Command]
    @="<path-to-sh> <path-to-script>"
    

    (...и так далее.)

  4. Запишите в своем httpd.conf файл:

    ScriptInterpreterSource Registry
    

Apache теперь будет разрешать ошибки Unix относительно интерпретации, заданной выбранным вами вариантом Bash.Это дает много большая гибкость, чем жесткое кодирование путей интерпретатора в реестре.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top