ஒரு npm கூறு நீக்கப்பட்டதால் எண்ணற்ற திட்டங்களுக்கு ஏற்பட்ட பாதிப்பு குறித்து சமீபத்தில் பரவலாக பேசப்பட்டது. அதில் குறிப்பிடப்பட்ட கூறு ஏன் நீக்கப்பட்டது என்ற விவரங்களை ஒதுக்கிவிட்டு, npm என்பது என்ன, அதன் சார்புக்கூறுகள் எவ்வாறு நிறுவப்படுகின்றன என்பது குறித்து அறிந்துகொள்ள முயல்வோம்.
npm என்றால் என்ன?
ஜாவாஸ்கிரிப்ட் என்பது ஒரு நிரலாக்க மொழி. இன்றைய நவீன வலைதளங்களின் பயனர் இடைமுகத்தில் நிகழ்நேர ஊடாடும் அனுபவத்தை (Realtime interactive experience) வழங்கிட இம்மொழி பெரிதும் பயன்படுகிறது. இதற்கென பல MVC கட்டமைப்புகளும் எழுதப்பட்டுள்ளன. AngularJS, Express, React, Backbone, போன்றவை இவற்றுள் சில. இவையனைத்தும் உலாவிகளில் ஜாவாஸ்கிரிப்ட்டை இயக்குகின்றன.
2009ம் ஆண்டு வரை இம்மொழி உலாவிகளில் மட்டுமே பயன்படுத்தப்பட்டு வந்தது. ரயன் தால் என்பவரும் மேலும் சில நிரலர்களும் இணைந்து, வழங்கிகளில் (server side) ஜாவாஸ்கிரிப்ட்டை இயக்க முயன்றதன் விளைவே NodeJS எனும் அற்புத கட்டமைப்பு ஆகும். npm என்பது NodeJS Package Manager என்பதன் சுருக்கமே. அதாவது NodeJSஇன் தொகுப்புகளுக்கான மேலாளர் தான் npm.
npm தொகுப்பு என்பது என்ன?
ஜாவாஸ்கிரிப்ட் நிரலர்களிடையே நிரல் பகிர்வையும், மறுபயன்பாட்டையும் ஊக்குவிப்பதும், எளிமைப்படுத்துவதுமே npm-இன் நோக்கம். Npm-இல் பங்கிடப்பட்ட நிரலை மேம்படுத்துவதையும் எளிதாக இருக்கிறது. Npm மூலம் பகிரப்பட்ட நிரல் துண்டுகளுக்கு தொகுப்பு (package) அல்லது கூறு (module) என்று பெயர்.
npm தொகுப்பின் அடிப்படைத்தகவல்கள்:
ஒரு திட்டத்தின் பெயர், பதிப்பு, உருவாக்குநர் போன்ற அடிப்படை தகவல்களை ஒரு சிறப்பு கோப்பில் பதிவு செய்யலாம். இக்கோப்பிற்கு package.json என்று பெயர். இதில் குறைந்தபட்சம் திட்டத்தின் பெயர், பதிப்பு ஆகியவை இருக்கவேண்டும். இதிலிருக்கும் இன்னபிற தகவல்களில் நமக்கு இந்த பதிவிற்கு தேவையான தகவல் திட்டத்தின் சார்புகளைப்பற்றியதாகும். சார்புகள் (dependencies) இருவகைப்படும்.
1) devDependencies – தொகுப்பின் உருவாக்கத்திற்கு மட்டும் தேவையான சார்புகள் இப்பட்டியலில் அடங்கும்.
2) dependencies – தொகுப்பினை பிறர் பயன்படுத்தும்போது தேவைப்படும் சார்புகள் இப்பட்டியலில் அடங்கும்.
எ.கா:
[code lang=”javascript”]
{
"name": "my_package",
"version": "1.0.0",
"dependencies": {
"my_dep": "1.0.0"
},
"devDependencies" : {
"my_test_framework": "3.1.0"
}
}
[/code]
இதில் “my_dep” என்ற கூறு நமது தொகுப்பின் செயல்பாட்டிற்கு தேவைப்படுகிறது. பிறர் பயன்படுத்தும்போதும் இச்சார்பு அவசியமாகிறது. ஆனால், நிரல் சோதனைக்குப் பயன்படும் “my_test_framework” என்ற கூறு நமது தொகுப்பின் உருவாக்குநர்களுக்கு மட்டுமே அவசியம், பயனர்களுக்கு இது தேவையில்லை.
npm பதிப்பெண்:
மேற்கண்ட எடுத்துகாட்டில், சார்புகளுக்கு அருகில், ஒரு எண் குறிப்பிடப்பட்டிருப்பதைக் காணலாம்.
[code lang=”javascript”]
"my_test_framework": "3.1.0"
[/code]
இதற்கு பதிப்பெண் என்று பெயர். ஒரு தொகுப்பின் எந்த வெளியீட்டை நாம் பயன்படுத்துகிறோம் என்பதை இப்பதிப்பெண்ணைக்கொண்டே அறியமுடியும். பதிப்பெண்ணின் அமைப்பில் மூன்று பகுதிகள் உள்ளன.
[code lang=”javascript”]
{தற்போதைய அம்சங்களை பாதிக்கும் மாற்றங்கள்}.{புதிய அம்சங்கள்}.{வழுநீக்கம்}
[/code]
குறிப்பிட்ட வெளியீட்டில் செய்யப்பட்டுள்ள மாற்றங்களின் தன்மையைப்பொருத்து அவற்றில் எப்பகுதி அதிகரிக்கப்படவேண்டும் என தீர்மானிக்கவேண்டும்.
npm நிறுவுமுறைகள்:
package.json-இல் கொடுக்கப்படும் சார்புகளை கணினியில் நிறுவுவதே npm-இன் பணி. கணினியில் அவற்றை எங்கே நிறுவவேண்டும் என்பதை சரியான நிறுவுமுறையை தேர்ந்தெடுப்பதன் மூலம் நாம் கட்டுப்படுத்தலாம். npm கூறுகளை நிறுவுவதில் இருவகைகள் உள்ளன.
- அந்த இடத்திற்குரிய நிறுவுமுறை – local installation
திட்டத்தின் கோப்பகத்திற்குள் node_modules என்ற கோப்பகத்தை உருவாக்கி, அதற்குள்ளாக சார்பு தொகுப்புகள் நிறுவப்படும். நிரலில் require என்ற திறவுச்சொல்லைக்கொண்டு சார்பு தொகுப்பை அணுகவேண்டுமெனில், அந்த இடத்திற்குரிய நிறுவுமுறையைத் தேர்வுசெய்யவேண்டும். - உலகளாவிய நிறுவுமுறை – global installation
இவ்வகை நிறுவுமுறையில் NodeJS நிறுவப்பட்டுள்ள கோப்பகத்தில் சார்புகள் நிறுவப்படும். NodeJS நிறுவப்பட்டுள்ள கோப்பகத்தை prefix என்ற அமைப்பைக்கொண்டு அறியலாம். யுனிக்ஸ் கணினிகளில், {prefix}/lib/node_modules என்ற கோப்பகத்திலும், விண்டோஸ் கணினிகளில் {prefix}/node_modules என்ற கோப்பகத்திலும் சார்புகள் நிறுவப்ப்டும். கட்டளை இடைமுகத்தின் (command line interface) மூலம் சார்புகளை அணுகவேண்டுமெனில் உலகளாவிய நிறுவுமுறையைத் தேர்வுசெய்யவேண்டும்.
சார்புகளை தீர்மானிக்கும் வழிமுறை:
நாம் ஒரு npm தொகுப்பினைச் சார்ந்திருக்கிறோம். அத்தொகுப்பு மற்றொரு தொகுப்பினைச் சார்ந்திருக்கிறது. இத்தொகுப்பு மேலும் சில தொகுப்புகளைச் சார்ந்திருக்கலாம். இதற்கு உள்ளமை சார்புகள் (nested dependencies) என்று பெயர். இந்த உள்ளமை சார்புகளை npm எவ்வாறு கையாளுகிறது என்பதை அறிந்துகொள்வதே இப்பதிவின் நோக்கம்.
npm -இன் ஆவணங்களின்படி, கீழ்கண்ட வழிமுறையை npm பின்பற்றுகிறது.
- node_modules கோப்பக மரத்தை வட்டிலிருந்து நினைவகத்திற்க்கு ஏற்றவேண்டும்.
- இம்மரத்தை நகலெடுக்கவேண்டும்.
- package.json கோப்பினை எடுத்துவந்து, இன்னபிற அடிப்படை தகவல்களையும் சேகரித்து, மரத்தின் நகலில் சேர்க்கவேண்டும்.
- மரத்தின் நகலில் பயணித்து, விடுபட்ட சார்புகளைச் சேர்க்கவேண்டும்.
- பிற கூறுகளைப் பாதிக்காதவகையில், இயன்றவரை மரத்தின் தண்டினையொட்டியே சார்புகளைச் சேர்க்கவேண்டும்.
- நகலினை அதன் மூலத்தோடு ஒப்பிட்டு, நகலிலிருந்து மூலத்திற்கு மாற்றத்தேவையான படிகளைப் பட்டியலிடவேண்டும்.
- மேற்கண்ட பட்டியலிலுள்ள படிகளை, அவற்றின் ஆழமான பகுதிகளிலிருந்து செய்யத்துவங்கவேண்டும்.
- புதிய சார்புகளை நிறுவுதல் (install), தேவையற்ற சார்புகளை நீக்குதல் (remove), சார்புகளை மேம்படுத்தல் (update), சார்புகளின் கோப்பகங்களை மேலாகவே, அல்லது கீழாகவே நகர்த்துதல் (move) ஆகியவையே படிகளின் வகைகள்.
இரு எடுத்துக்காட்டுகளுடன் இவ்வழிமுறையை புரிந்துகொள்ள முயற்சிக்கலாம். நமது தொகுப்பிற்கு “A” என்று பெயரிடலாம். அதன் சார்புகளையும், அவற்றின் உள்ளமை சார்புகளையும் இங்கே பட்டியலிடலாம்.
தொகுப்பு | சார்புகள் |
A | B, C |
B | C |
C | D |
வழிமுறையின் முதல் நிலையில் நமக்கு B, C என்ற சார்புகள் தேவைப்படுகின்றன. அவற்றை A-இன் node_modules கோப்பகத்தில் நேரடியாக நிறுவலாம்.
[code lang=”javascript”]
A
+–B
+–C
[/code]
B-தொகுப்பு ‘C’-ஐச் சார்ந்துள்ளது. ஆனால், ஏற்கனவே அது நிறுவப்பட்டுள்ளதால், இங்கே தனியாக அதை நிறுவவேண்டியதில்லை.
C-தொகுப்பு ‘D’-ஐச் சார்ந்துள்ளது. இயன்றவரை மரத்தின் தண்டினையொட்டியே சார்புகளை சேர்க்கவேண்டும் என்பதால், இதனையும் நாம் A-இன் node_modules கோப்பகத்தில் நேரடியாகவே நிறுவலாம்.
அனைத்து சார்புகளையும் தீர்மானித்தபின், கோப்பக வடிவம் கீழ்கண்டவாறு அமைகிறது.
[code lang=”javascript”]
A
+–B
+–C
+–D
[/code]
ஒருவேளை, சார்புகள் கீழ்கண்டவாறு இருப்பின்,
தொகுப்பு | சார்புகள் |
A | B, C |
B | C, D@1.0.0 |
C | D@2.0.0 |
இங்கே D-யின் இருவேறு பதிப்புகளை Bயும், Cயும் சார்ந்திருக்கின்றன. மேற்கண்ட வழிமுறையின் படி, முதல் நிலையில் எந்தவொரு மாற்றமும் இல்லை. A-இன் node_modulesகோப்பகத்தில், B மற்றும் C சார்புகள் நேரடியாக நிறுவப்படும்.
[code lang=”javascript”]
A
+–B
+–C
[/code]
B-இன் சார்புகளில், C-ஏற்கனவே நிறுவப்பட்டுள்ளது. எனவே, D@1.0.0 மட்டும் A-இன் node_modules-இல் நேரடியாக நிறுவப்படும்.
[code lang=”javascript”]
A
+–B
+–C
+–D@1.0.0
[/code]
C-இன் சார்புகளில் D உள்ளது. குறிப்பாக சொல்லவேண்டுமெனில், D-இன் இரண்டாம் பதிப்பை (D@2.0.0), C சார்ந்துள்ளது. node_modules -இல் நிறுவப்பட்டிருப்பது இதற்கு முந்தைய பதிப்பாகும். எனவே, C-இன் கோப்பகத்திற்குள் D-இன் இரண்டாம் பதிப்பு நிறுவப்படவேண்டும்.
வழிமுறையின் இறுதியில், கோப்பகம் கீழ்கண்ட வடிவத்தை பெற்றிருக்கும்.
[code lang=”javascript”]
A
+–B
+–C
+–D@2.0.0
+–D@1.0.0
[/code]