কীভাবে নির্দিষ্ট ফোল্ডারটি এনপিএম প্রকাশ করতে হয় তবে প্যাকেজ রুট হিসাবে


91

আমার একটি প্রকল্প রয়েছে যা উত্সগুলি তৈরি এবং প্যাকেজিংয়ের জন্য একটি ঝাল টাস্ক এবং একটি ডিরেক্টরিতে মুক্তির জন্য অন্তর্ভুক্ত dist। আমার লক্ষ্য এটি এনপিএম প্যাকেজ হিসাবে প্রকাশ করা, তবে কেবল আমার ডিস্ট ফোল্ডার। Npm ডকুমেন্টেশন বলছেন যে আমি ব্যবহার করতে পারেন filesরপ্তানি ফাইল উল্লেখ করার ট্যাগ। এটা কাজ করে। তবে, ডকুমেন্টেশন এও বলে:

আপনি যদি অ্যারেতে কোনও ফোল্ডারের নাম রাখেন, তবে এতে সেই ফোল্ডারের ভিতরে থাকা ফাইলগুলিও অন্তর্ভুক্ত থাকবে

ফলাফলটি হ'ল একটি এনপিএম প্যাকেজ, যা নোড_মডিউলগুলি দেখতে:

উত্পন্ন এনপিএম প্যাকেজ

তবে আমি আমার সমস্ত ফাইল প্যাকেজের মূলটিতে দেখতে চাই (সেই distফোল্ডারটি ছাড়াই )। আমার index.jsফাইলটি distফোল্ডারের ভিতরে রয়েছে তবে এটির মূলটি হওয়া উচিত। আমি সেট ট্যাগ করার চেষ্টা করেছি filesযেমন /dist/**/*কিন্তু এটি কাজ করে নি।

আমি কীভাবে এটি অর্জন করতে পারি?

উত্তর:


45

আমার একই ইচ্ছা আছে তবে আমি মনে করি কেবল এনপিএম সরঞ্জাম ব্যবহার করে এটি সম্পাদনের কোনও উপায় নেই । আপনার প্যাকেজটি সাজানোর জন্য অন্য স্ক্রিপ্ট / সরঞ্জাম ব্যবহার করা যেতে পারে।

বিকল্প সমাধান

বর্তমানে আমি আমার কপি করছি package.jsonমধ্যে distফোল্ডার এবং তারপর চলমান npm packভিতরে distফোল্ডার। আমি মনে করি এটি অবশ্যই আমাদের প্যাকেজের পছন্দসই ব্যবস্থা সরবরাহ করে।

এই এনপিএম ডিজাইনে এখানে কিছু প্রাসঙ্গিক পড়া হচ্ছে: কেন নোডে ডিরেক্টরি নেই

এছাড়া যে jspm করেনা সম্মান খেয়াল করা আকর্ষণীয় directories.libবিকল্প package.jsonএবং যখন npm প্যাকেজ সমাধানে ফাইল rearranges। এগুলি আমার জন্য ঘটেছিল কারণ আমি একটি সাধারণ লাইব্রেরি তৈরি করতে চাই যা জেএসপিএম বা এনপিএম / ওয়েবপ্যাকের মাধ্যমে গ্রাস করা যায়।


4
(কেন কোনও ডিরেক্টরি.লিব ...) একটি মৃত লিঙ্ক
শানিমাল

4
নোডের কোনও ডিরেক্টরি.লিব কেন বলছে না, আপনি যদি আমাদের উপায়ে এটি না করেন তবে আপনার ব্যথা হওয়া উচিত। এগুলি যা করে তা হ'ল এই সমস্যাটির সমাধানের জন্য সরঞ্জামগুলির প্রয়োজনীয়তা তৈরি করা।
ব্রায়ান তাকিতা

6
আমি বিশ্বাস করি এই উত্তরটি পুরানো। npm packপ্যাকেজ.জসন filesএবং mainক্ষেত্রগুলি ব্যবহার করে নীচের প্রতিক্রিয়া হিসাবে এবং .npmignoreকোনও বিকাশকারীকে একটি নির্দিষ্ট, ইনস্টলযোগ্য ডিরেক্টরি থেকে প্যাকেজ তৈরি করার জন্য প্রয়োজনীয় সমস্ত কিছু দেয়।
জেফটোপিয়া

4
"প্রকাশিত সাবডির" প্যাটার্নটি প্রবাহিত / প্রয়োগ করতে কিছু স্ক্রিপ্ট তৈরি করা হয়েছে
15

4
কেউ npmignore, ফাইল এবং প্যাকেজ.জসনে মূল সম্পত্তি ব্যবহার করে কীভাবে এটি অর্জন করা যায় সমাধান সমাধান করতে পারে? আমি সমস্ত ফাইলকে রুটে নিয়ে যেতে চাই এবং ডিস ফোল্ডারটি রাখতে চাই না
Angad

17

মূল পোস্টার (@ আরবসনরোসা) এর সাথে আমারও একই সমস্যা রয়েছে। আমার ক্ষেত্রে আমি টাইপক্রিপ ব্যবহার করি যা একটি distডিরেক্টরিতে সংকলিত হয় । যদিও আমি মূল ডিরেক্টরিতে টাইপস্ক্রিপ্ট সংকলন করতে পারতাম আমার মনে package.jsonহয় ডিস্ট ডিরেক্টরিতে একটি পৃথক ফাইল তৈরি করা সবচেয়ে ভাল সমাধান ।
এটি টুইটারের সাথে অনুলিপি করার জন্য @ এসএসভিএনসি পরামর্শের অনুরূপ package.json:

প্যাকেজিং প্রক্রিয়াটির অংশ হিসাবে আপনাকে package.jsonপ্যাকেজটির জন্য একটি উত্পন্ন করতে হবে যা package.jsonমূল ডিরেক্টরিতে মূল ফাইল থেকে পৃথক তবে পৃথক is

যুক্তিসহ ব্যাখ্যা:

  • মূল package.jsonফাইলটি ডেভলপমেন্ট ফাইল। এটিতে স্ক্রিপ্টগুলি বা বিকাশ নির্ভরতা থাকতে পারে যা প্যাকেজ ব্যবহারকারীর কোনও উপযোগী নয় তবে এটি আপনার জন্য সুরক্ষা উদ্বেগ তৈরি করতে পারে। আপনার প্যাকেজিং পদ্ধতিতে কোডটি অন্তর্ভুক্ত থাকতে পারে যা সেই তথ্যটি উত্পাদন থেকে বাদ দেয় package.json
  • আপনি আপনার প্যাকেজটি বিভিন্ন পরিবেশে স্থাপন করতে চাইতে পারেন যার জন্য বিভিন্ন প্যাকেজ ফাইলের প্রয়োজন হতে পারে (যেমন আপনি বিভিন্ন সংস্করণ বা নির্ভরতা রাখতে চাইতে পারেন)।

--- সম্পাদনা ---

মন্তব্যে আমাকে সমাধানের জন্য জিজ্ঞাসা করা হয়েছিল। সুতরাং আমি এখানে কিছু কোড ব্যবহার করছি। এটিকে একটি উদাহরণ হিসাবে বিবেচনা করা উচিত যা এটি জেনেরিক হতে বোঝায় না এবং এটি আমার প্রকল্পগুলির জন্য নির্দিষ্ট।

আমার সেটআপ:

package.json         - main package.json with dev dependencies and useful scripts.
.npmignore           - files to ignore; copied to 'dist' directory as part of the setup.
/src                 - directory where my typescript code resides.
/src/SetupPackage.ts - bit of code used to setup the package.
/dist                - destination directory for the compiled javascript files.

আমি কেবল distডিরেক্টরি প্যাকেজ করতে চাই এবং প্যাকেজের ডিরেক্টরিটি ডিরেক্টরি হতে হবে।

ফাইল SetupPackage.tsআমার মধ্যে srcনির্দেশিকাতে কম্পাইল করা হবে SetupPackage.jsdistটাইপ করা বিষয় দ্বারা ডিরেক্টরি:

import fs from "fs";

// DO NOT DELETE THIS FILE
// This file is used by build system to build a clean npm package with the compiled js files in the root of the package.
// It will not be included in the npm package.

function main() {
    const source = fs.readFileSync(__dirname + "/../package.json").toString('utf-8');
    const sourceObj = JSON.parse(source);
    sourceObj.scripts = {};
    sourceObj.devDependencies = {};
    if (sourceObj.main.startsWith("dist/")) {
        sourceObj.main = sourceObj.main.slice(5);
    }
    fs.writeFileSync(__dirname + "/package.json", Buffer.from(JSON.stringify(sourceObj, null, 2), "utf-8") );
    fs.writeFileSync(__dirname + "/version.txt", Buffer.from(sourceObj.version, "utf-8") );

    fs.copyFileSync(__dirname + "/../.npmignore", __dirname + "/.npmignore");
}

main();

এই নথি:

  • রুটটি অনুলিপি করে package.jsonতবে স্ক্রিপ্টগুলি এবং দেব নির্ভরতাগুলি সরিয়ে দেয় যা প্যাকেজের প্রয়োজন নেই। এটি প্যাকেজের মূল প্রবেশ বিন্দুও ঠিক করে।
  • কল package.jsonকরা কোনও ফাইল থেকে প্যাকেজের সংস্করণ লিখেছে version.txt
  • .npmignoreমূলটি থেকে প্যাকেজটি অনুলিপি করে ।

.Npmignore সামগ্রীটি হ'ল:

*.map
*.spec.*
SetupPackage.*
version.txt

অর্থাৎ ইউনিট পরীক্ষা (স্পেক ফাইল) এবং টাইপস্ক্রিপ্ট ম্যাপ ফাইলগুলি পাশাপাশি SetupPackage.jsফাইল এবং version.txtএটি তৈরি করা ফাইলটিকেও উপেক্ষা করা হয় । এটি একটি পরিষ্কার প্যাকেজ ছেড়ে যায়।

অবশেষে মূল package.jsonফাইলটিতে বিল্ড সিস্টেম দ্বারা ব্যবহারের জন্য নিম্নলিখিত স্ক্রিপ্ট রয়েছে (ধরে নেওয়া shহয় শেল হিসাবে ব্যবহৃত হয়)।

"scripts": {
    "compile": "tsc",
    "clean": "rm -rf dist",
    "prebuildpackage": "npm run clean && npm run compile && node dist/SetupPackage.js",
    "buildpackage": "cd dist && npm pack"
  },

প্যাকেজটি তৈরি করতে বিল্ড সিস্টেমটি রেপো ক্লোন করে, npm installএবং তারপরে npm run buildpackageযা চালায় :

  • distপরিষ্কার সংকলন নিশ্চিত করার জন্য ডিরেক্টরিটি মুছে দেয় ।
  • টাইপস্ক্রিপ্ট কোডটি জাভাস্ক্রিপ্টে সংকলন করে।
  • প্যাকেজিংয়ের জন্য SetupPackage.jsপ্রস্তুত করে এমন ফাইলটি কার্যকর করে dist
  • distডিরেক্টরিতে সিডি এবং সেখানে প্যাকেজ তৈরি করে।

আমি version.txtপ্যাকেজ.জসনে সংস্করণ পেতে এবং আমার রেপো ট্যাগ করার সহজ উপায় হিসাবে ফাইলটি ব্যবহার করি । এটি করার অন্যান্য অসংখ্য উপায় রয়েছে বা আপনি সংস্করণটি স্বয়ংক্রিয়ভাবে বৃদ্ধি করতে চাইতে পারেন। এটিকে সরান SetupPackage.tsএবং .npmignoreযদি এটি আপনার পক্ষে কার্যকর না হয়।


এই উত্তরটি দেখতে সেরা হিসাবে মনে হচ্ছে, তবে আপনার কাছে কি থিউরি বাদ দিয়ে প্রস্তুত সমাধান রয়েছে?
yumaa

4
@ ইয়ুমা আমার উত্তরটি একটি দৃ concrete় উদাহরণ দিয়ে সম্পাদনা করেছি। আশা করি এটি কার্যকর হবে।
এলি আলগ্রান্টি

4
কিছু পরিবর্তন নিয়ে আমার জন্য কাজ করেছেন। বর্তমান SetupPackage.tsফাইল srcপরিবর্তে ডিরেক্টরি ডিরেক্টরিতে অনুলিপি করে dist। ধন্যবাদ 👍
হরিন্দর সিংহ

15

আপনার প্রকল্পে গিট থাকলে আপনি ছোট হ্যাক ব্যবহার করতে পারেন। প্যাকেজ.জসনে পরবর্তী স্ক্রিপ্টগুলি যুক্ত করুন

    "prepublishOnly": "npm run build && cp -r ./lib/* . && rm -rf ./lib",
    "postpublish": "git clean -fd",

এখন আপনি publishএনএমপি জড়িত কমান্ড চালানোর সময় prepublishOnly। এটি ফাইলগুলি তৈরি করে এবং সেগুলি libফোল্ডারে সংরক্ষণ করে (একটি বিল্ড স্ক্রিপ্ট আপনার প্রকল্পের উপর নির্ভর করে)। পরবর্তী কমান্ডটি ফোল্ডারগুলি মূল ফোল্ডারে অনুলিপি করে এবং মুছে দেয় lib। প্রকাশের পরে postpublishস্ক্রিপ্টটি প্রকল্পটিকে আগের অবস্থায় ফিরিয়ে দেয়।


4
আমি এই সমাধানের একটি অনুরাগী!
ড্যানম্যাড

7

আমি .npmignoreআশেপাশে জিনিসগুলি সরানোর বা অনুলিপি করার পরিবর্তে আপনাকে ব্যবহার করার পরামর্শ দিচ্ছি , বিশেষত যদি আপনি মোতায়েনের জন্য সিআই ব্যবহার করেন এবং কেবলমাত্র যে ফাইলগুলি প্রকাশ করতে চান না সেখানে তা যুক্ত করুন।

https://docs.npmjs.com/misc/developers#keeping-files-out-of-your-package

উদাহরণ:

#tests
test
coverage

#build tools
.travis.yml
.jenkins.yml
.codeclimate.yml

#linters
.jscsrc
.jshintrc
.eslintrc*

#editor settings
.idea
.editorconfig

হালনাগাদ:

আপনি যদি নিজের কোডটি একই রেপো ব্যবহার করে বিভিন্ন এনপিএম প্যাকেজগুলিতে বিভক্ত করতে চান তবে আমি সম্প্রতি এই প্রকল্পে ঝাঁপিয়ে পড়েছি: লেরনা এবং সত্যিই দুর্দান্ত দেখাচ্ছে।

হয়ত আপনার একবার দেখা উচিত


9
প্যাকেজের রুট ডিরেক্টরিতে আমাদের বিল্ড করা ফাইলগুলি এখনও ছাড়তে হবে। সিআইয়ের পক্ষে সম্ভবত অনুমোদিত। আমি লিঙ্কযুক্ত আইজাকের ব্লগ থেকে পোস্টটি পর্যবেক্ষণ করুন এবং তার require('mypackage/foo')পরিবর্তে আপনার সমাধানের জন্য কীভাবে অনুমতি দেবে তা আমাকে বলুনrequire('mypackage/dist/foo')
scvnc

আমি এখানে সমস্যাটি সমাধান করার চেষ্টা করছিলাম না। আপনি যদি নিজের কোডটি বিভক্ত করতে চান তবে আমি সম্প্রতি এই প্রকল্পটিতে umpুকে পড়েছি : লার্নাজ.আইও এবং সত্যিই দুর্দান্ত দেখাচ্ছে
থ্র্যাম

অন্য একটি সরঞ্জাম পাওয়া গেল যা দেখতে পেলাম
থ্রাম

হ্যাঁ উপাদান ইউআই এটি ব্যবহার করে এবং আমি এটি ব্যবহার করেছিলাম। আমার শেষ সংস্থায়, আমি এটি ঠিক পেয়েছি
নিক

6

এটি আমার পক্ষে ভাল কাজ করে।

সিডি টিএমপিডিআইআর; npm pack/path/to/package.json

Tarball টিএমপিডিআইআর ডিরেক্টরিতে তৈরি করবে।


Answer এই উত্তরটি আন্ডাররেটেড। npm packএছাড়াও প্যাকেজ.জসন filesক্ষেত্র (বা .npmignore) আশ্চর্যজনকভাবে কাজ করে।
জেফটোপিয়া

1

আপনি যদি (এবং আমি প্রস্তাবিত) শব্দার্থক-রিলিজ ব্যবহার করে pkgRootথাকেন তবে .releaserc.jsonফাইলটিতে বিকল্পটি যুক্ত করুন:

{
  "pkgRoot": "dist",
  "plugins": [
    "@semantic-release/commit-analyzer",
    "@semantic-release/release-notes-generator",
    "@semantic-release/npm",
    [
      "@semantic-release/exec",
      {
        "prepareCmd": "npx rjp package.json version nextRelease.version"
      }
    ],
    [
      "@semantic-release/git",
      {
        "assets": ["package.json"]
      }
    ],

  ],
}

এটি সমস্যার যত্ন নেবে। আপনার distফোল্ডারে কোনও package.jsonফাইল রয়েছে তা নিশ্চিত করুন make cpআপনার postbuildস্ক্রিপ্টে একটি যুক্ত করে আপনি এটি সহজেই করতে পারেন । আরজেপি ইনস্টল করুন


0

আপনার distফোল্ডারটি প্রকাশ করতে হবে

এটি অর্জনের প্রাকৃতিক উপায়, এনপিএম পদ্ধতির অনুসারে, মূলটি হ'ল ফোল্ডারটি প্রকাশ করা। এটি করার বিভিন্ন উপায় রয়েছে, আপনি যে চূড়ান্ত পরিবেশের সাথে কাজ করতে চান তার উপর নির্ভর করে:

  1. এনপিএম প্রকাশ <ফোল্ডার>আপনার প্যাকেজ রেপো থেকে একটি এনএমপি রেজিস্ট্রিতে প্রকাশ করুন এবং তারপরে আপনি অন্যান্য প্যাকেজ ইনস্টল করার সাথে সাথে অন্য প্যাকেজে আপনার প্যাকেজ ইনস্টল করুন। আপনার ক্ষেত্রে এটি হবে npm publish dist
  2. আপনি যদি স্থানীয়ভাবে প্যাকেজটি ব্যবহার করতে চান তবে এনএমপি অন্য কোনও প্রকল্পে <ফোল্ডার> ইনস্টল করুন । আপনার ক্ষেত্রে আপনি অন্য প্রকল্পে যান এবং চালানnpm install relative/path/to/dist
  3. আপনি node_modulesযদি অন্য প্রকল্পে তত্ক্ষণাত আপনার মূল প্যাকেজের পরিবর্তনগুলি প্রতিবিম্বিত করতে চান তবে এনপিএম অন্য ফোল্ডারে স্থানীয়ভাবে আপনার ফোল্ডারটিকে আপনার অন্য প্রকল্পে যুক্ত করুন। আপনার ক্ষেত্রে আপনি প্রথমে cd distচালান npm linkএবং তারপরে অন্য প্রকল্পে যান এবং চালানnpm link robsonrosa-ui-alert

পূর্বশর্ত : উপরের যে কোনও ক্ষেত্রে, প্রকাশ / ইনস্টল / লিঙ্কের আগে, আপনাকে distকমপক্ষে একটি সঠিক package.jsonফাইল আপনার ফোল্ডারে রাখতে হবে। আপনার ক্ষেত্রে, আপনার প্যাকেজটির নামটি আপনার প্যাকেজ.জসন ফাইল হিসাবে সংজ্ঞায়িত করতে হবে"name": "robsonrosa-ui-alert" । সাধারণত, আপনি এখানে আরও কিছু ফাইল চাইবেন যেমন README.md বা LICENSE।

পদ্ধতি 2 এবং 3 এ মন্তব্য

সাধারণত আপনি যখন প্যাকেজটি এইভাবে ইনস্টল করা প্যাকেজটি ব্যবহার করেন তখন প্যাকেজ নির্ভরতা নিয়ে সমস্যা হয়। এটি এড়াতে প্রথমে প্যাকেজটি প্যাক করুন npm pack distএবং তারপরে প্যাকড টার্বল থেকে লক্ষ্য প্রকল্পে প্যাকেজটি ইনস্টল করুন npm install path/to/package-tarball.tgz

অটোমেশন উদাহরণ

আপনি prepareস্ক্রিপ্টের সাথে মিলিত স্ক্রিপ্টটি ব্যবহার করে প্রকাশনা প্রক্রিয়াটি স্বয়ংক্রিয় করতে পারেন build। অতিরিক্তভাবে, আপনি "private": trueআপনার প্যাকেজ রেপোর রুট ডিরেক্টরিতে অবস্থিত প্যাকেজ.জসন-এ ফিল্ড সহ প্যাকেজ রুট ফোল্ডারের দুর্ঘটনাজনক প্রকাশের বিরুদ্ধে আপনার প্যাকেজটিকে সুরক্ষা দিতে পারেন । এখানে একটি উদাহরণ:

  "private": true,
  "scripts": {
    "build": "rm -rf dist && gulp build && cat ./package.json | grep -v '\"private\":' > dist/package.json",
    "prepare": "npm run build"
  },

এই ভাবে আপনি রুট ফোল্ডার প্রকাশ এবং প্যাকেজ তৈরী এবং package.json অনুলিপি পাবেন না distফোল্ডার স্বয়ংক্রিয়ভাবে করেন, প্রকাশনার প্রক্রিয়া মধ্যে।


-1

এখানে আরও একটি পদ্ধতির যা আমি মনে করি এটি সবচেয়ে পরিষ্কার। বিল্ড অ্যান্ড প্যাক স্ক্রিপ্টগুলিতে ফাইলগুলি সরানো বা পাথ নির্দিষ্ট করার প্রয়োজন ছাড়াই এটি সমস্ত কনফিগারেশন ভিত্তিক:

package.json মূল ফাইলটি নির্দিষ্ট করুন।

{
    "main": "lib/index.js",
}

কিছু অতিরিক্ত টাইপ স্ক্রিপ্ট বিকল্প:

  • উল্লেখ করুন rootDir। এই ডিরেক্টরিতে সমস্ত উত্স কোড থাকবে এবং এতে এটিতে একটি indexফাইল থাকা উচিত (বা অন্য কোনও ফাইল যা আপনি প্রধান হিসাবে ব্যবহার করতে পারেন package.json)।
  • উল্লেখ করুন outDir। আপনার টিএসসি কমান্ডটি এটিই তৈরি করবে

tsconfig.json

{
    "compilerOptions": {
        "rootDir": "src",
        "outDir": "lib",
    },
    ...

}

নামটি আলাদাভাবে বদলে নামকরণ বাদে ওপিতে মূলত যা ছিল তা কি একই নয়?
Bob9630

-1

বিকল্প 1: ফোল্ডারে নেভিগেট করুন এবং "এনপিএম প্রকাশ" সম্পাদন করুন। আদেশ

বিকল্প 2: এনপিএম প্রকাশ / পথ / ডিরেক্টরি চালান


-4

কেবল একটি .npmignoreফাইল তৈরি করুন এবং এতে নিম্নলিখিতগুলি যুক্ত করুন:

*.*
!dist/*

4
ওপি অনুরোধ অনুসারে এটি কি করে? আমি এটি কাজ করতে সক্ষম ছিল না। ধারণাটি ছিল প্রকাশিত প্যাকেজটিতে কেবল ডিরেক্টরিকে অন্তর্ভুক্ত না করে কেবলমাত্র ডিস্ট ডিরেক্টরিতে অন্তর্ভুক্ত থাকবে। আমি এটি নিশ্চিত করেছিলাম যে আমরা ইতিমধ্যে প্যাকেজ.জসন "ফাইল" তালিকায় সম্পন্ন করা যেতে পারে এমন কোনও ডিরেক্টরি ডিরেক্টরিতে অন্তর্ভুক্ত করি না।
Bob9630
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.