8

Joel Berger は、Web サーバーを起動してローカル ファイルを提供するこの小さなプログラムを投稿しました

use Mojolicious::Lite;

@ARGV = qw(daemon);

use Cwd;
app->static->paths->[0] = getcwd;

any '/' => sub {
    shift->render_static('index.html');
    };

app->start;

コマンドラインを入力するの@ARGVを忘れたので、事前に入力しました。起動すると、選択したポートを示すメッセージが表示されます。可能な場合は 3000 を使用します。

$ perl ~/bin/mojo_cwd
[Fri Mar 29 19:14:09 2013] [info] Listening at "http://*:3000".
Server available at http://127.0.0.1:3000.

テストスイートがどこを探すべきかを知ることができるように、そのポートをプログラムで取得したいと思います。これに関する私の実験はどれも役に立たず、私はいつも間違った方向に進んでいたと思います. 開始するまでポートを選択しないようで、 を呼び出すとstart、それで終わりです。

私も自分でポートを指定したくありません。

これは緊急の問題ではありません。私は現在、別の単純な HTTP フレームワークを使用してこれを解決していますが、可能であれば、そのほとんどを Mojo に置き換えることを検討しています。古いものはまだ機能するので、これは私のやり方ではなく、本当に良いものです.

4

2 に答える 2

9

できませんが、daemonコマンドはポート 3000 にのみバインドし、指示しない限り他のことを試みません。を使用している場合Test::Mojoは、事前にポートを知る必要はありません。それ以外の場合は、いつでもアプリケーションを小さなMojo::Server::Daemonスクリプトでラップできます。

use Mojolicious::Lite;
use Mojo::IOLoop;
use Mojo::Server::Daemon;

get '/' => {text => 'Hello World!'};

my $port   = Mojo::IOLoop->generate_port;
my $daemon = Mojo::Server::Daemon->new(
  app    => app,
  listen => ["http://*:$port"]
);
$daemon->run;
于 2013-04-01T11:47:47.330 に答える
7

パラメータを使用--listenして、リッスンする場所をアプリに指定します。

use Mojolicious::Lite;

@ARGV = qw(daemon --listen http://*:5000);

use Cwd;
app->static->paths->[0] = getcwd;

any '/' => sub {
    shift->render_static('index.html');
    };

app->start;

アプリ内のポート番号には次の方法でアクセスできます$self->tx->local_port

#!/usr/bin/env perl
use Mojolicious::Lite;

@ARGV = qw(daemon --listen http://*:5000);

use Cwd;
app->static->paths->[0] = getcwd;

any '/' => sub {
    my $self = shift;

    $self->render_text('port: '. $self->tx->local_port);
    };

app->start if $ENV{MOJO_MODE} ne 'test';

1;

たとえば、ファイルで実行中のアプリにアクセスできるため、Mojoliciousアプリをテストするのが好きです。Test::Mojot/test_mojo.t

use strict;
use warnings;

use feature 'say';

use Test::More;
use Test::Mojo;

$ENV{MOJO_MODE} = 'test';

require "$FindBin::Bin/../test_mojo.pl";

my $t = Test::Mojo->new;
$t->get_ok('/')->status_is(200)->content_is('port: '.$t->tx->remote_port);

say 'local port: '. $t->tx->local_port; #as seen from the user-agent's perspective
say 'remote port:'. $t->tx->remote_port;
done_testing();

あなたが達成しようとしていることを正しく理解できたかどうかはわかりませんが、これがお役に立てば幸いです。

于 2013-03-31T06:47:25.897 に答える