npm, Cargo, Composer ಮತ್ತು pip ಎಲ್ಲವೂ ಒಂದೇ semver shorthand ಅನ್ನು ವಿಭಿನ್ನವಾಗಿ ಅರ್ಥೈಸುತ್ತವೆ, ಮತ್ತು ನಾನು ಪರೀಕ್ಷಿಸಿದ ಹದಿಮೂರು range expressionsಗಳಲ್ಲಿ ಕೇವಲ ಎರಡು ಮಾತ್ರ ಈ ನಾಲ್ಕೂ ಸಾಧನಗಳಲ್ಲಿ ಒಂದೇ ರೀತಿಯಲ್ಲಿ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತವೆ.
ನಾನು ಪ್ರತಿಯೊಂದು ಮ್ಯಾನೇಜರ್ಗಾಗಿ ಪ್ರತ್ಯೇಕ ಪಾರ್ಸರ್ಗಳನ್ನು ಬರೆದೆ, ಅವುಗಳ ಅಧಿಕೃತ specs ಅನುಸರಿಸಿದೆ, ಮತ್ತು ನಂತರ ಹತ್ತೊಂಬತ್ತು ವರ್ಷ版本的 ಮ್ಯಾಟ್ರಿಕ್ಸ್ ವಿರುದ್ಧ ಪ್ರತಿಯೊಂದು range ಅನ್ನು ಪರೀಕ್ಷಿಸಿದೆ. 13 × 19 ಗ್ರಿಡ್ (247 ಸೆಲ್ಗಳು) ಒಂದು ಅಸ್ಪಷ್ಟ ಚಿತ್ರಣವನ್ನು ನೀಡಿತು: ಕೇವಲ 17 ಸೆಲ್ಗಳು ಪ್ರತಿಯೊಂದು ಸಾಧನದಿಂದಲೂ ಒಂದೇ ರೀತಿಯ "yes" ಅಥವಾ "no" ಉತ್ತರವನ್ನು ನೀಡಿದವು, ಮತ್ತು ಆ 17ರಲ್ಲಿ ಹೆಚ್ಚಿನವು ಏಕಕರ ನಿರಾಕರಣೆಗಳಾಗಿದ್ದವು. ಸಂಕ್ಷಿಪ್ತವಾಗಿ ಹೇಳಬೇಕೆಂದರೆ, ಈ ಸಾಧನಗಳು "yes" ಎನ್ನುವುದಕ್ಕಿಂತ "no" ಎನ್ನುವುದರ ಬಗ್ಗೆ ಹೆಚ್ಚು ಒಮ್ಮತ ಹೊಂದಿವೆ.
ಸಾಧನಗಳು ಏಕೆ ಭಿನ್ನವಾಗಿವೆ
ನಾಲ್ಕೂ ಮ್ಯಾನೇಜರ್ಗಳು Semantic Versioning ಅನ್ನು ಅನುಸರಿಸುತ್ತವೆ ಎಂದು ಹೇಳಿಕೊಳ್ಳುತ್ತವೆ, ಆದರೂ ಪ್ರತಿಯೊಂದೂ ತನ್ನದೇ ಆದ shorthand ನಿಯಮಗಳನ್ನು ಸೇರಿಸುತ್ತವೆ.
- Caret (^) ಮತ್ತು dot-x – npm caret ಅನ್ನು ಬೆಂಬಲಿಸುತ್ತದೆ; pip caret ಮತ್ತು dot-x ಎರಡನ್ನೂ ನಿರ್ಲಕ್ಷಿಸುತ್ತದೆ. ಇದುವೊಂದೇ npm ಮತ್ತು pip ನಡುವೆ 49-ಸೆಲ್ ಅಸಮ್ಮತಿಯನ್ನು ಉಂಟುಮಾಡುತ್ತದೆ.
- Bare versions – Cargo ಕೇವಲ
1.2.3ಅನ್ನು caret range ಎಂದು ಪರಿಗಣಿಸುತ್ತದೆ, ಅಂದರೆ "1.x ಗೆ ಹೊಂದಿಕೆಯಾಗುತ್ತದೆ" ಎಂದರ್ಥ. npm ಮತ್ತು Composer ಅದೇ ಸ್ಟ್ರಿಂಗ್ ಅನ್ನು ನಿಖರವಾದ ಹೊಂದಾಣಿಕೆಯಾಗಿ (exact match) ಓದುತ್ತವೆ, ಕೇವಲ1.2.3ಅನ್ನು ಮಾತ್ರ ಸ್ವೀಕರಿಸುತ್ತವೆ. - Tilde (~) – Cargo ನ tilde minor ವರ್ಷನ್ ಅನ್ನು ನಿರ್ಧರಿಸುತ್ತದೆ (
~1.2ಎಂಬುದು1.2.*ಗೆ ಹೊಂದಿಕೆಯಾಗುತ್ತದೆ ಆದರೆ1.3.0ಗೆ ಅಲ್ಲ). Composer ನ tilde *major* ವರ್ಷನ್ ಅನ್ನು ನಿರ್ಧರಿಸುತ್ತದೆ (~1.2ಎಂಬುದು1.*` ಗೆ ಹೊಂದಿಕೆಯಾಗುತ್ತದೆ). minor ಘಟಕವನ್ನು ಬದಲಾಯಿಸುವ ಯಾವುದೇ ವರ್ಷನ್ನಲ್ಲಿ ಈ ಎರಡು ವ್ಯಾಖ್ಯಾನಗಳು ಭಿನ್ನವಾಗುತ್ತವೆ.
Pre-release ನಿರ್ವಹಣೆಯು ಮತ್ತೊಂದು ಅಚ್ಚರಿಯನ್ನು ನೀಡುತ್ತದೆ. ^1.2.3 ನಂತಹ range 2.0.0-rc.1 ಅನ್ನು ಒಳಗೊಳ್ಳುವುದಿಲ್ಲ, ಅದರ ಸಂಖ್ಯಾತ್ಮಕ ಭಾಗವು ಮೇಲಿನ ಮಿತಿಗಿಂತ (upper bound) ಕಡಿಮೆಯಿದ್ದರೂ ಸಹ. ನಿಯಮ: range ನಲ್ಲಿ ಸ್ಪಷ್ಟವಾಗಿ pre-release identifier ಅನ್ನು ಉಲ್ಲೇಖಿಸದ ಹೊರತು, pre-releases ಅನ್ನು ಹೊರಗಿಡಲಾಗುತ್ತದೆ.
ಏಕೈಕ ಸುರಕ್ಷಿತ cross-tool ಸಿಂಟ್ಯಾಕ್ಸ್
ಸ್ಪಷ್ಟವಾದ inequality ranges—ಉದಾಹರಣೆಗೆ >=1.2.0 <2.0.0—npm, Cargo, Composer ಮತ್ತು pip ನಲ್ಲಿ ಒಂದೇ ರೀತಿಯಲ್ಲಿ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತವೆ ಎಂದು ಈ ಪ್ರಯೋಗವು ತೋರಿಸುತ್ತದೆ. ಪ್ರತಿಯೊಂದು ಮ್ಯಾನೇಜರ್ ಕೂಡ ಯಾವುದೇ ಅಡಗಿರುವ caret ಅಥವಾ tilde semantics ಇಲ್ಲದೆ, ಎರಡು ಮಿತಿಗಳನ್ನು ನೇರ ಸಂಖ್ಯಾತ್ಮಕ ಮಿತಿಗಳಾಗಿ (literal numeric limits) ಪರಿಗಣಿಸುತ್ತದೆ.
ನೀವು "ಕನಿಷ್ಠ 1.2 ಇರುವ ಯಾವುದೇ 1.x ವರ್ಷನ್" ಎಂದು ವ್ಯಕ್ತಪಡಿಸಬೇಕಿದ್ದರೆ, ಅದನ್ನು ಪೂರ್ಣವಾಗಿ ಬರೆಯಿರಿ. ಇದು ಕೆಲವು ಹೆಚ್ಚುವರಿ ಅಕ್ಷರಗಳನ್ನು ಬಳಸಬಹುದು; ಆದರೆ ಕೋಡ್ ಎಲ್ಲಿ ಚಲಿಸಿದರೂ ಅದು ನಿರೀಕ್ಷಿತ ರೆಸಲ್ಯೂಶನ್ ಅನ್ನು ಖಚಿತಪಡಿಸುತ್ತದೆ.
shorthand ಯಾವಾಗ ಅರ್ಥಪೂರ್ಣವಾಗಿರುತ್ತದೆ
ಏಕ ಭಾಷೆಯ ಪ್ರಾಜೆಕ್ಟ್ಗಳಿಗೆ shorthand ಆಕರ್ಷಕವಾಗಿರುತ್ತದೆ. ಕೇವಲ npm ಪರಿಸರ ವ್ಯವಸ್ಥೆಯೊಳಗೆ (ecosystem), ^1.2.3 ಎಂಬುದು "ಭವಿಷ್ಯದ minor ಮತ್ತು patch ರಿಲೀಸ್ಗಳಿಗೆ ಹೊಂದಿಕೆಯಾಗುತ್ತದೆ" ಎಂಬುದನ್ನು ಸಂಕ್ಷಿಪ್ತವಾಗಿ ತಿಳಿಸುತ್ತದೆ. ಬಳಸುವ ಸಾಧನವು ಬದಲಾಗುವುದಿಲ್ಲ ಎಂದು ನಿಮಗೆ ತಿಳಿದಿದ್ದಾಗ Cargo ನ caret ಅಥವಾ Composer ನ tilde ಗೂ ಇದು ಅನ್ವಯಿಸುತ್ತದೆ. ಆದರೆ ಒಂದೇ manifest ಅನ್ನು ವಿವಿಧ ಭಾಷೆಗಳ ನಡುವೆ ಮರುಬಳಕೆ ಮಾಡಿದಾಗ ಅಥವಾ CI ಕೆಲಸವು ವಿವಿಧ ಪರಿಸರ ವ್ಯವಸ್ಥೆಗಳಿಂದ ಅವಲಂಬನೆಗಳನ್ನು (dependencies) ಪಡೆಯುವಾಗ ಅಪಾಯ ಎದುರಾಗುತ್ತದೆ.
ಸಾರಾಂಶ
ಭಾಷೆಗಳ ನಡುವಿನ ಹೊಂದಾಣಿಕೆಗಾಗಿ semver shorthand ಮೇಲೆ ಅವಲಂಬಿತವಾಗುವುದು ಒಂದು ಜೂಜಾಟವಿದ್ದಂತೆ. ವರ್ಷನ್ ನಿರ್ಬಂಧವು (version constraint) ಎಲ್ಲೆಡೆ ಒಂದೇ ಅರ್ಥವನ್ನು ನೀಡುತ್ತದೆ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು ಇರುವ ಏಕೈಕ ವಿಶ್ವಾಸಾರ್ಹ ಮಾರ್ಗವೆಂದರೆ ಸ್ಪಷ್ಟವಾದ inequalities ಬರೆಯುವುದು. ನಿಮಗೆ ಸಂಕ್ಷಿಪ್ತತೆ ಬೇಕಾದಾಗ, ಒಂದೇ ಪರಿಸರ ವ್ಯವಸ್ಥೆಯೊಳಗೆ ಇರಿ; ನಿಮಗೆ ಸ್ಥಿರತೆ ಬೇಕಾದಾಗ, ಸ್ಪಷ್ಟತೆಗಾಗಿ shorthand ಅನ್ನು ಬಿಟ್ಟುಬಿಡಿ.
