Publishing My First NPM Package

Intro

I published my first package, jellybean, to npm! I actually published the package back when I first created the repository in September, just to experiment. However, it didn’t work back then and I kind of forgot about it after that. Th…


This content originally appeared on DEV Community and was authored by Leyang Yu

Intro

I published my first package, jellybean, to npm! I actually published the package back when I first created the repository in September, just to experiment. However, it didn't work back then and I kind of forgot about it after that. This week, I fixed up the issues I was having and now it works. 😊 In this post, I'll be explaining the process of how I published the package and fixed the issues I previously encountered.

Preparing a Project to be Published

I decided to publish my program to npm since it's the most common package manager for JavaScript programs. There are a few steps I followed in order to prepare the program to be published. First, in the package.json file, I added main and bin parameters. In addition, you need to have name and version parameters as well. For example, here is a snippet from my package.json file:

{
  "name": "jellybean",
  "version": "1.0.10",
  "description": "From one small program, you can create an entire website. Jellybean is a static site generator created in Node.js that lets you easily convert your text/markdown files into HTML.",
  "main": "src/index.js",
  "bin": {
    "jellybean": "src/index.js"
  }
}

Name and version are pretty self-explanatory, but main specifies the main entry point into the program and bin specifies the command to run the associated executable file. In this case, when a user runs the command "jellybean" after installing the package, the file "src/index.js" will be executed. In addition, each time I published to npm, I incremented the version and if you forget to do so, you will receive an error message.

In addition, I added the line:

#!/usr/bin/env node

To the top of the file to be executed ("src/index.js" in this case), which specifies that the program should be run in a node environment.

Testing the Project

Before publishing to npm, I tested the program by running:

npm link

From within the same directory as the repository. Then I ran the program as if it had already been published (eg. running jellybean --version would print the version number, etc.). You can read more about how to use npm link here.

Publishing the Project

Next, I published the program by running the commands:

npm adduser
npm publish

npm adduser creates or links to your npm account. npm publish publishes your package, which you should run each time you want to update your package.

Problems I Encountered

Although the steps described above are quite simple, I encountered some problems along the way. Because I originally published the package in September and installed it, I had an older version of the jellybean files in my C:\Users\...\AppData\Roaming\npm folder. Therefore, every time I tried to run the jellybean command, I got the following error:

& : The term '/user/bin/env.exe' is not recognized as the name of a cmdlet, function, script file, or operable program. Check
the spelling of the name, or if a path was included, verify that the path is correct and try again.

I fixed this issue by deleting the old files from the npm folder and once I published my package to npm, I reinstalled it globally and was able to successfully run the program.

Testing

I partnered with another student from my class, Suhhee, in order to test each other's programs. When Suhhee tested my program, she received the following error:

Error: ENOENT: no such file or directory, open 'src/layout.html'
    at Object.openSync (fs.js:498:3)
    at Object.readFileSync (fs.js:394:35)
    at getHtmlLayout 

Because of this, I changed my file paths from relative to absolute paths using path.resolve() so that the program can be run from any directory. For example instead of:

return fs.readFileSync(
        'src/index.html',
        'utf8'
    );

I updated the code to:

return fs.readFileSync(
        path.resolve(__dirname, '../src/layout.html'),
        'utf8'
    );

Conclusion

In conclusion, the process of setting up an npm package was pretty straightforward, other than a few problems that I was able to resolve. Over the past almost three months, I've been working on this project every week and getting to publish it was a great end to this journey. If you're interested in trying out the program, you can read more about it here or run:

npm install -g jellybean
jellybean --help

To get started. Thanks so much for reading!


This content originally appeared on DEV Community and was authored by Leyang Yu


Print Share Comment Cite Upload Translate Updates
APA

Leyang Yu | Sciencx (2021-11-27T03:25:05+00:00) Publishing My First NPM Package. Retrieved from https://www.scien.cx/2021/11/27/publishing-my-first-npm-package-2/

MLA
" » Publishing My First NPM Package." Leyang Yu | Sciencx - Saturday November 27, 2021, https://www.scien.cx/2021/11/27/publishing-my-first-npm-package-2/
HARVARD
Leyang Yu | Sciencx Saturday November 27, 2021 » Publishing My First NPM Package., viewed ,<https://www.scien.cx/2021/11/27/publishing-my-first-npm-package-2/>
VANCOUVER
Leyang Yu | Sciencx - » Publishing My First NPM Package. [Internet]. [Accessed ]. Available from: https://www.scien.cx/2021/11/27/publishing-my-first-npm-package-2/
CHICAGO
" » Publishing My First NPM Package." Leyang Yu | Sciencx - Accessed . https://www.scien.cx/2021/11/27/publishing-my-first-npm-package-2/
IEEE
" » Publishing My First NPM Package." Leyang Yu | Sciencx [Online]. Available: https://www.scien.cx/2021/11/27/publishing-my-first-npm-package-2/. [Accessed: ]
rf:citation
» Publishing My First NPM Package | Leyang Yu | Sciencx | https://www.scien.cx/2021/11/27/publishing-my-first-npm-package-2/ |

Please log in to upload a file.




There are no updates yet.
Click the Upload button above to add an update.

You must be logged in to translate posts. Please log in or register.