2013-03-30 25 views
5

Joel Berger posted this little program to start a web server to serve local files i działa świetnie:Jak mogę uzyskać port wybrany przez Mojolicious :: Lite?

use Mojolicious::Lite; 

@ARGV = qw(daemon); 

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

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

app->start; 

I oznakowane wiersza poleceń w @ARGV bo zapomniałem zrobić. Kiedy zaczyna, daje komunikat informujący, który port wybrał, używając 3000 jeśli to możliwe:

$ 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. 

chciałbym dostać ten port pro gramatycznie więc zestaw testowy może wie, gdzie go szukać , a ja wolałbym tego nie robić przez wyrzucanie danych wyjściowych. Żadne z moich eksperymentów na ten temat nie było przydatne i myślę, że zawsze zmierzałem w niewłaściwym kierunku. Wygląda na to, że nie wybiera portu, dopóki się nie uruchomi, a kiedy zadzwonię pod numer start, to już koniec.

Ja też nie chcę określać portu.

To nie jest pilna sprawa. Mam aktualne rozwiązanie tego problemu z innym prostym schematem HTTP, ale szukałem możliwości zastąpienia większości tych rzeczy Mojo, jeśli mogę. Ponieważ stare rzeczy wciąż działają, jest to po prostu coś miłego, a nie coś na swój sposób.

+1

Przydałoby się, aby opublikować kod, z którego próbujesz uzyskać numer portu - abyśmy mogli zobaczyć, czego się spodziewasz, aby się narazić i jak to zrobić. –

+1

Cały kod jest właśnie tutaj. Chcę uruchomić ten skrypt i znać numer portu. Odpowiedź sri jest taka, że ​​zawsze jest 3000 lub nic. –

+1

który byłby łatwy do przetestowania: próba uruchomienia 2 wystąpień aplikacji równolegle daje błąd "Nie można utworzyć gniazda nasłuchiwania: adres już jest używany w ..." - to pokazuje, że domyślnie jest to jedyny port wypróbowany –

Odpowiedz

7

Nie możesz, ale polecenie daemon wiąże się tylko z portem 3000 i nie spróbuje niczego innego, chyba że mu to powiesz. Jeśli używasz Test::Mojo, nie musisz znać portu z wyprzedzeniem tak czy inaczej, na cokolwiek innego, zawsze możesz zawinąć aplikację w małym skrypcie 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; 
+0

Dobrze, dobrze wiedzieć. Naprawdę nie tworzę aplikacji Mojo. Używam bardzo lekkiego serwera do testowania pobierania statycznych plików dla kodu klienta WWW. –

4

Z --listen param można określić w swojej aplikacji, gdzie słuchać:

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; 

Można uzyskać dostęp do numeru portu w aplikacji z $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; 

Lubię testować Mojolicious aplikacje z Test::Mojo ponieważ masz dostęp do uruchomionej aplikacji, na przykład w pliku t/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(); 

Nie jestem pewien, czy poprawnie zrozumiałem, co próbujesz osiągnąć, ale mam nadzieję, że ci to pomoże.

+0

Powiedziałem konkretnie, że nie chcę wybrać portu. Nie chcę pracować nad znalezieniem otwartego portu. Również dostęp do serwera WWW w celu uzyskania portu oznacza, że ​​nie muszę się dowiedzieć, co to jest port. –