javascript - Κατανόηση του συμβολικού συνδέσμου πηγαίου κώδικα σε ένα έργο Angular 2 με webpack
Έχω δύο έργα Angular2 που χρησιμοποιούν webpack ως συγκεντρωτή μονάδων και TypeScript.
Με σκοπό να μοιραστώ κώδικα μεταξύ τους, χώρισα μέρος του πηγαίου κώδικα και δημιούργησα ένα σύμβολο-σύνδεσης σε αυτόν τον 'εξωτερικό' πηγαίο κώδικα από κάθε ένα από αυτά τα δύο έργα.
Αφού γίνει αυτό, ο "συνδεδεμένος με συμβολικό σύνδεσμο κώδικας" δεν μπορεί να επιλύσει σωστά τις εισαγωγές.
παρακάτω ένα έργο «hello world» για να δείξει τις ανησυχίες μου.
https://github.com/datracka/angular2-symlink-issue
Αυτό το έργο εκτελείται απευθείας ΑΛΛΑ αν αφαιρέσετε τον δοσμένο φάκελο src και δημιουργήσετε έναν συμβολικό σύνδεσμο σε έναν άλλο φάκελο src με τον ίδιο πηγαίο κώδικα ΑΛΛΑ που βρίσκεται στο /another/path/src τότε λαμβάνετε ένα σφάλμα μεταγλώττισης:
ERROR in .-shared/src/main.ts
Module build failed: TypeError: Path must be a string. Received undefined
at assertPath (path.js:7:11)
at Object.dirname (path.js:1326:5)
at ensureTypeScriptInstance (/Users/vicensfayos/Projects/angular2-abc/node_modules/ts-loader/index.js:156:103)
at Object.loader (/Users/vicensfayos/Projects/angular2-abc/node_modules/ts-loader/index.js:403:14)
Οπότε η ερώτησή μου είναι: τι μου λείπει με τα symlinks όταν "διανέμω" τον πηγαίο κώδικα σε έναν άλλο φάκελο εκτός του φακέλου του έργου;
Η εκτίμησή μου είναι ότι αφορά τη σωστή διαμόρφωση της επίλυσης αντικειμένων στο webpack https://webpack.github.io/docs/resolving.html για την υπερισχύση του αλγορίθμου φόρτωσης node_modules του node.js https://nodejs.org/api/modules.html#modules_loading_from_node_modules_folders αλλά χωρίς τύχη.
Ελπίζω κάποιος να μπορέσει να με καθοδηγήσει προς κάποια κατεύθυνση.
Απάντηση #1
Βρήκα την απάντηση.
Η εικασία μου ήταν σωστή. Ήταν για το πώς το nodejs επιλύει τις εξαρτήσεις. https://nodejs.org/api/modules.html#modules_loading_from_node_modules_folders
Ο κωδικός που συνδέεται με symbolic link προσπαθεί να βρει τις εξαρτήσεις ανεβαίνοντας προς τα πάνω αποτυγχάνοντας μέχρι να βρει το node_module. Αλλά δεν υπάρχει τίποτα εκεί. Το node_module βρίσκεται στο γονικό έργο.
Επομένως, η λύση είναι να δημιουργήσετε ένα άλλο συμβολικό σύνδεσμο από τον κωδικά που είναι ήδη σε σύνδεσμο προς τον φάκελο node_modules του γονικού έργου για να επιλυθούν οι εξαρτήσεις.
Απάντηση #2
Έχω μια παρόμοια ρύθμιση αλλά αποφάσισα να προσθέσω μια διαδρομή στο tsconfig.json μου στην κύρια εφαρμογή μου:
"paths": {
"*": ["*", "node_modules/*"]
}
Όλα τα modules που απαιτούνται από τον πηγαίο κώδικα στους κοινόχρηστους φακέλους με συμβολικούς συνδέσμους βρίσκονται στο φάκελο node_modules της κύριας εφαρμογής. Αυτό λέει στον compiler να κοιτάξει στο φάκελο node_modules της κύριας εφαρμογής πριν προσπαθήσει να βρει έναν φάκελο node_modules πιο πάνω στη δομή.
