2016-12-02 2 views
0

Скажем, у вас есть проект НПМ со следующим package.json:Чистый package.json перед упаковкой

{ 
    "name": "XXX", 
    "version": "YYY", 
    "license": "ZZZ", 
    "scripts": { 
    "scriptA": "...", 
    "scriptB": "...", 
    "preinstall": "...", 
    "postinstall": "..." 
    }, 
    "devDependencies": { 
    "depA": "vA", 
    "depB": "vB" 
    }, 
    "dependencies": { 
    "depC": "vC", 
    "depD": "vD" 
    } 
} 

Когда упаковка/публикации пакета, вам не нужны scripts или devDependencies ключи. Но более опасно, сценарии preinstall и postinstall могут вызвать странные/нежелательные действия, когда люди устанавливают ваш пакет как зависимость.

Итак, как вы очищаете свой package.json, т.е. удаляете ключи, которые вам не нужны?

В настоящее время я использую npm 3.10. Если я использую команду npm pack, то в соответствии с npm documentation он просто упакует текущий пакет, если аргументы не предоставлены (поэтому берут необработанные package.json с диска), и нет никаких параметров, которые я могу предоставить для его очистки.

Я могу, конечно, написать свои собственные скрипты, которые бы застегнули пакет и сгенерировали мой собственный package.json. Это путь?

ответ

0

Использование самой ню, это не представляется возможным. Начиная с npm 3.10, npm publish или npm pack действительно просто включит чистую копию вашего package.json в ваш tgz.

Таким образом, решение заключается в том, что создает собственный упакованный файл, чтобы иметь полный контроль над включенным package.json.

Базового пример

Примечание: это использование оболочки и синхронный метода от НОГО fs

const fs = require('fs'); 
const os = require('os'); 

const shell = require('shelljs'); 
const targz = require('tar.gz'); 

// create temp directory 
const tempDirectory = fs.mkdtempSync(`${os.tmpdir()}/your-project-tarball-`); 
const packageDirectory = `${tempDirectory}/package`; 

// create subfolder package 
fs.mkdirSync(packageDirectory); 

// read existing package.json 
const packageJSON = require('./package.json'); 

// copy all necessary files 
// https://docs.npmjs.com/files/package.json#files 
shell.cp('-R', packageJSON.files, packageDirectory); 
shell.cp('-R', ['README.md', 'CHANGELOG.md', 'LICENSE'], packageDirectory); 

// create your own package.json or modify it here 
Reflect.deleteProperty(packageJSON, 'scripts'); 
fs.writeFileSync(`${packageDirectory}/package.json`, JSON.stringify(packageJSON, null, 2)); 

// create tgz and put it in dist folder 
targz().compress(packageDirectory, 'your-package.tgz'); 

Реальных жизненного примера с Lodash

Это, например, что lodash Lib делает в версии 4.17.2. Их оригинальный package.json выглядит (ср https://github.com/lodash/lodash/blob/4.17.2/package.json):

{ 
    "name": "lodash", 
    "version": "4.17.2", 
    "license": "MIT", 
    "private": true, 
    "main": "lodash.js", 
    "engines": { "node": ">=4.0.0" }, 
    "scripts": { 
    "build": "npm run build:main && npm run build:fp", 
    "build:fp": "node lib/fp/build-dist.js", 
    "build:fp-modules": "node lib/fp/build-modules.js", 
    "build:main": "node lib/main/build-dist.js", 
    "build:main-modules": "node lib/main/build-modules.js", 
    "doc": "node lib/main/build-doc github && npm run test:doc", 
    "doc:fp": "node lib/fp/build-doc", 
    "doc:site": "node lib/main/build-doc site", 
    "doc:sitehtml": "optional-dev-dependency [email protected]^9.0.1 && npm run doc:site && node lib/main/build-site", 
    "pretest": "npm run build", 
    "style": "npm run style:main && npm run style:fp && npm run style:perf && npm run style:test", 
    "style:fp": "jscs fp/*.js lib/**/*.js", 
    "style:main": "jscs lodash.js", 
    "style:perf": "jscs perf/*.js perf/**/*.js", 
    "style:test": "jscs test/*.js test/**/*.js", 
    "test": "npm run test:main && npm run test:fp", 
    "test:doc": "markdown-doctest doc/*.md", 
    "test:fp": "node test/test-fp", 
    "test:main": "node test/test", 
    "validate": "npm run style && npm run test" 
    }, 
    "devDependencies": { 
    "async": "^2.1.2", 
    "benchmark": "^2.1.2", 
    "chalk": "^1.1.3", 
    "cheerio": "^0.22.0", 
    "codecov.io": "~0.1.6", 
    "coveralls": "^2.11.15", 
    "curl-amd": "~0.8.12", 
    "docdown": "~0.7.1", 
    "dojo": "^1.11.2", 
    "ecstatic": "^2.1.0", 
    "fs-extra": "~1.0.0", 
    "glob": "^7.1.1", 
    "istanbul": "0.4.5", 
    "jquery": "^3.1.1", 
    "jscs": "^3.0.7", 
    "lodash": "4.17.1", 
    "lodash-doc-globals": "^0.1.1", 
    "markdown-doctest": "^0.9.0", 
    "optional-dev-dependency": "^2.0.0", 
    "platform": "^1.3.3", 
    "qunit-extras": "^3.0.0", 
    "qunitjs": "^2.0.1", 
    "request": "^2.78.0", 
    "requirejs": "^2.3.2", 
    "sauce-tunnel": "^2.5.0", 
    "uglify-js": "2.7.4", 
    "webpack": "^1.13.3" 
    }, 
    "greenkeeper": { 
    "ignore": [ 
     "lodash" 
    ] 
    } 
} 

Но опубликованный package.json выглядит (ср https://unpkg.com/[email protected]/package.json)

{ 
    "name": "lodash", 
    "version": "4.17.2", 
    "description": "Lodash modular utilities.", 
    "keywords": "modules, stdlib, util", 
    "homepage": "https://lodash.com/", 
    "repository": "lodash/lodash", 
    "icon": "https://lodash.com/icon.svg", 
    "license": "MIT", 
    "main": "lodash.js", 
    "author": "John-David Dalton <[email protected]> (http://allyoucanleet.com/)", 
    "contributors": [ 
    "John-David Dalton <[email protected]> (http://allyoucanleet.com/)", 
    "Mathias Bynens <[email protected]> (https://mathiasbynens.be/)" 
    ], 
    "scripts": { "test": "echo \"See https://travis-ci.org/lodash/lodash-cli for testing details.\"" } 
} 

, где вы можете увидеть scripts и devDependencies ключи, например, не существует больше. Это делается с использованием шаблона JavaScript package.jst до тех пор, пока скрипт nodejs Lodash CLI

Смежные вопросы