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