typescript - Angular-cli bygge mappestruktur
Standard angular-cli bygg genererer dist-mappen med veldig flat struktur - en assets-mappe og js-, html-filer. Finnes det en måte å lage f.eks. en scripts-mappe og legge alle js-filene i den under byggeprosessen?
Svar #1
CLI-en støtter dette ikke fullt ut ennå, men den gir noen nyttige verktøy som kan hjelpe deg langt på vei. Jeg trengte dette for å distribuere Angular-applikasjonen min sammen med en WAR samtidig som jeg prøvde å minimere mengden kompleksitet lagt til via servlet-mappings. Dette spørsmålet nevner ikke J2EE spesifikt, men jeg tror prinsipper fra denne løsningen kan deles på tvers av ulike miljøer.
Relevante ng build-parametere:
--deploy-url: Banekartleggingen som vil bli brukt på ressurser. Dette er sannsynligvis så nærme Angular-CLI for øyeblikket kommer det du leter etter.--output-path: Angir en utgangskatalog for Angular-bygget (spesielt brukte jeg dette for å angi unike utgangskataloger for forskjellige miljøer, siden applikasjonen distribueres til flere mål med forskjellige konfigurasjoner).--base-href: Rot-URI-en for applikasjonen. F.eks.,/angular-app/forhttp://localhost:4200/angular-app/. Dette setter<base href="<uri>">head-taggen og er nødvendig for ruter uten hash. Det kan også være nødvendig for andre ting.
Den mest interessante for deg er sannsynligvis --deploy-url. Hvis du setter en deploy-URL til /dist/, for eksempel, vil referansene til JS-filer i din bygde applikasjon bli prefikset med /dist/.
To store store med denne metoden:
--deploy-urlendrer ikke output-banen for JS-filene. Det endrer bare referansene til JS-filene. Filene selv vil fortsatt bli lagt i roten av byggekatalogen. Du må legge til et steg i byggeprosessen din for å fikse dette manuelt.--deploy-urlser ikke ut til å fungere for andre ressurser. Jeg plasserer alle mine andre ressurser iassets/-katalogen, og den ferdige outputen refererer fortsatt til ressursene viaassets/<path>(i stedet fordist/assets/<path>som ønsket). Du kan omgå dette ved å opprette en virtuell katalog eller en URL-omskriving.
Som referanse, her er min resulterende katalogstruktur for WAR-filen:
app/
dist/ <-- Deployed Angular application
assets/
(images, CSS, etc)
*.js
(other assets pulled into the root path, e.g. *.(svg|eot|woff|woff2|ttf) from Font Awesome)
index.html
WEB-INF/
...
index.jsp
Dette er trinnene jeg tar for å produsere denne strukturen:
ng build -pr false --prod --output-path build/node-prod --base-href /angular-app/ --deploy-url /angular-app/dist/.- Kopier innholdet i
build/node-prodtil WAR-byggekatalogensapp/distvia en Gradle-oppgave. - Pek
index.jsptilindex.htmlvia innholdet<%@include file="dist/index.html"%>. - Legg til en servlet-mapping for standardservleten (statisk innhold) for stiene
/dist/*og/assets/*. - Legg til URL-mapping via http://tuckey.org/urlrewrite/ for
^/assets/(.*)$til/dist/assets/$1(eller via httpd, nginx, etc.). Dette er nødvendig på grunn av fangsten gitt ovenfor for--deploy-urlsom ikke fungerer for andre ressurser. - (Valgfritt) legg til 301- eller 302-viderekobling for
^/dist/index.html$til rotkontekstbanen for å forhindre at brukere får tilgang til appen viadist-URIen.
I den resulterende nettappen er http://localhost/angular-app/ det eneste gyldige endepunktet for applikasjonen min. Dette endepunktet peker til index.jsp, som inkluderer innholdet i index.html, som laster relevant JS via <script src="/angular-app/dist/<some-file>.js"></script>-tagger.
Når noen andre ressurser er nødvendige, for eksempel logo-bildet, gjør siden en forespørsel til assets/<file-name>, som blir omskrevet på serversiden via Tuckey til dist/assets/<file-name>, og løses transparent til den forespurte ressursen.
Det fine med denne løsningen var at vi kunne distribuere Angular-applikasjonen i rotkonteksten uten å måtte legge alt som ng build bygde inn i rot-WAR-stien. Dette er spesielt fint fordi vi ikke ønsker å legge til globale servlet-mappinger (f.eks. *.js) når det kan unngås.
