2015-04-03 12 views
5

Publikuję bibliotekę do NPM.Ciągnięcie plików z katalogu do folderu głównego dla NPM

Po zbudowaniu biblioteki wynikowy artefakt zostanie umieszczony w folderze dist znajdującym się w katalogu głównym mojego projektu pod numerem index.js.

Gdy użytkownicy instalują z KMP Chciałbym index.js być obecny w korzenia folderu utworzonego w ich folderze node_modules. Obecnie pozostaje w katalogu o nazwie dist.

Jak mogę to zrobić?

Moja packages.json:

{ 
    "name": "my-package", 
    "version": "0.0.9", 
    "files": ["dist/*"], 
    "main": "index.min.js", 
    "private": false, 
    "dependencies": {}, 
    "devDependencies": {}, 
    "repository": "[email protected]:username/my-package.git" 
} 
+1

Zamiast tego umieść powstały artefakt w katalogu głównym?Lub użyć skryptu 'prepublish' do skopiowania artefaktu do katalogu głównego, a następnie usunąć go' postpublish'? Lub użyć skryptu 'postinstall', aby przenieść plik do katalogu głównego? – Kenan

Odpowiedz

1

miałem dokładnie ten sam problem.

Nie rozwiązałem tego, kopiując pliki do góry, ale kopiując potrzebne pliki do folderu ./dist/, a następnie robiąc z tego npm publish; NPM traktuje ten folder jako kompletny pakiet i wszystko działa bardzo ładnie. Jedyne pliki Musiałem skopiować z folderu głównego były:

  • package.json
  • README.md

Ponieważ mamy zamiar skopiować te pliki w dół do folderu ./dist/ zanim nie publikowania, NIE chcemy, aby plik package.json odnosił się do ./dist/. Dlatego całkowicie usuń wpis package.json z files, ponieważ nie musimy mówić, które pliki zrobimy - zabierzemy wszystko w folderze ./dist/. Używam TypeScript, więc mam również wpis typings i znowu brak odwołania do ./dist/.

{ 
    "name": "my-package", 
    "version": "0.0.9", 
    "main": "index.min.js", 
    "typings": "index.d.ts", 
    "private": false, 
    "dependencies": {}, 
    "devDependencies": {}, 
    "repository": "[email protected]:username/my-package.git" 
} 

Teraz do etapu publikacji. Zbudowałem zadanie, które wykona dla mnie publikację, dzięki czemu będzie ładnie i automatycznie (z wyjątkiem inkrementacji wersji pakietu #).

Odżywianie Użyję odrodzenia Node(), aby rozpocząć proces npm. Ponieważ jednak pracuję na Windowsie, użyłem raczej "cross-spawn" niż zwykłego wbudowanego Node.js spawn (czego się nauczyłem, nie działało, gdy miałem spacje na mojej ścieżce!).

Oto mój plik łyk, z bitami maszynopis usuniętych:

var gulp = require('gulp'); 
var del = require('del'); 
var spawn = require('cross-spawn'); // WAS: require('child_process').spawn; 

var config = { 
    src: { tsFiles: './src/**/*.ts' }, 
    out: { path: './dist/' } 
} 

gulp.task('clean',() => { 
    return del('dist/*'); 
}); 


gulp.task('build', ['clean'],() => { 
    .... 
}); 


gulp.task('publish', ['build'], (done) => { 
    // Copy the files we'll need to publish 
    // We just use built-in gulp commands to do the copy 
    gulp.src(['package.json', 'README.md']).pipe(gulp.dest(config.out.path)); 

    // We'll start the npm process in the dist directory 
    var outPath = config.out.path.replace(/(\.)|(\/)/gm,''); 
    var distDir = __dirname + '\\' + outPath + '\\'; 
    console.log("dist directory = " + distDir); 

    // Start the npm process 
    spawn('npm', ['publish'], { stdio:'inherit', cwd:distDir }) 
     .on('close', done) 
     .on('error', function(error) { 
      console.error(' Underlying spawn error: ' + error); 
      throw error; 
     }); 
}); 

Wskazówka kiedy nazywamy ikry() mijamy w 3rd argument, który jest opcji. Głównym hasłem jest tutaj cwd:distDir, który nakazuje spawnu uruchomienie procesu npm z katalogu ./dist/. Ponieważ używanie odrodzenia może powodować problemy, które włączyłem w obsługę błędów odradzania. W trakcie rozwiązywania problemów z korzystaniem z usługi spawn() bardzo przydatny był następujący artykuł: StackOverflow.

To działało jak urok; mój opublikowany pakiet zawiera wszystkie pliki w katalogu głównym, a folder ./dist/ nie jest publikowany.

Powiązane problemy