javascript - Web API - Folosește sarcina Gulp pentru a seta dinamic adresa endpoint-ului
Așa cum am descris în întrebarea mea anterioară:
Separarea dezvoltării clientului web și a serverului web în Asp.net web API 2
Pentru a obține o separare completă între client și server, vreau să setezi o variabilă care să țină punctul final pentru cererile clientului. Când partea de client este dezvoltată, cererile vor fi trimise către un „server stub” care returnează valori implicite, astfel încât partea de client să poată fi dezvoltată fără a depinde de dezvoltarea serverului. Acest server stub rulează pe un port diferit de portul real al serverului, iar când se realizează integrarea între server și client, într-un branch de integrare, variabila va deține portul real al serverului.
În această privință, am aflat că un instrument de construire precum Gulp m-ar putea ajuta.
Lucrez cu controlul versiunilor Tfs.
Ceea ce vreau este, de exemplu, să scrii o sarcină care să funcționeze astfel:
gulp.task('setEndPoint', function() {
var branchName = // How do I get it?
if (branchName == "Project.Testing")
endPoint = "localhost/2234"
if (branchName == "Project.Production")
endPoint = "localhost/2235"
});
Există o modalitate de a obține ramura curentă în care rulează sarcina?
Mulțumesc pentru ajutoare
Răspuns #1
În loc să verifici intern ramura în scriptul tău, ce-ai spune să folosești argumente pentru a diferenția o versiune dev de o versiune prod.
Ai putea folosi yargs pentru asta:
var argv = require('yargs').argv;
gulp.task('setEndPoint', function() {
if (argv.dev)
endPoint = "localhost/2234"
else
endPoint = "localhost/2235"
});
yargs va lega argumentul scriptului la o proprietate a obiectului:
gulp build --bla
Îți va permite să ai în tine sarcina gulp:
var argv = require('yargs').argv;
if (argv.bla) {
// this line runs
}
Cu aceasta, dacă apelezi gulp build fără argumente, nu va avea dev setat pe true (argv.dev va fi nedefinit) și va alege endpoint-ul prod. Acest lucru se va întâmpla pe TFS sau când vrei să rulezi împotriva backend-ului real pe calculatorul tău de dezvoltare.
Pentru dezvoltarea fără backend, poți să apelezi: gulp build --dev ceea ce va selecta endpoint-ul dev.
Dacă preferi, poți folosi argv.prod și seta pe TFS gulp build --prod, astfel încât dacă nu treci niciun argument, va fi folosit serverul stub.
Răspunsul #2
Gulp rulează într-un mediu diferit și TFS rulează într-un mediu diferit. Aș fi foarte surprins dacă ar putea vedea setările celuilalt. Dar, problema ta actuală este să identifici url-ul corect (sau doar portul) pentru API. Cred că cea mai bună modalitate de a rezolva această problemă este să folosești un fișier de variabile de mediu.
Să spunem că echipa client dezvoltă în ramura client, iar echipa server dezvoltă în ramura server. Odată ce sunt gata, ambele echipe își vor îmbina modificările în ramura principală. Acum codul de producție va rula din ramura principală.
Ideea este să adăugați fișierul env.js în ramura client și în ramura principală. Asigurați-vă că modificările pentru acest fișier din ramura client sunt excluse din verificarea în ramura principală (Acest lucru este foarte ușor cu TFS, faceți clic dreapta pe fișier și selectați exclude from check-in). Acum acest fișier va conține orice variabile la nivel de mediu (URL-ul API în cazul dvs.). Clientul dvs. Angular va citi valorile din acest fișier pentru execuție. În acest fel, puteți avea fișiere env.js separate pentru dezvoltare, testare și producție și nu trebuie să vă ocupați de problemele cauzate de schimbarea lor la implementare.
Iată un articol grozav despre cum puteți realiza acest lucru. Aș sugera cu tărie să urmați această cale, deoarece oferă o mare flexibilitate în ceea ce privește multe lucruri pe care le puteți realiza. gulp este un instrument excelent de construire pe partea clientului. Această abordare cu gulp pentru alte sarcini, cum ar fi minificarea, ar face aplicația dumneavoastră mai bună.
Vă rog să mă anunțați dacă aveți întrebări.
Mulțumesc, Soma.
