【问题标题】:Creating an NPM package out of a Create React App and publish on Gitlab从 Create React App 创建 NPM 包并在 Gitlab 上发布
【发布时间】:2021-07-22 12:25:18
【问题描述】:

这可能是一个愚蠢的问题,但我真的不知道发生了什么。

我使用crate react app 创建了一个 React 应用程序并将其作为私有存储库上传到我的 GitLab 帐户。在 localhost:3000 本地运行 yarn start 后,(默认)React 应用程序按预期启动。因为我需要为持续的代码开发创建包,所以我开始在 GitLab 使用 NPM Registry。这实际上很容易:

  1. 在应用目录中创建.npmrc
  2. 像这样添加scoperepository IDauth token(我选择使用个人token)
# Set URL for your scoped packages.
# This is my top-level group at GitLab

@scope:registry=https://gitlab.com/api/v4/packages/npm/


# Add the token for the scoped packages URL.
# I have chosen to use the personal key -> more infos: https://docs.gitlab.com/ee/user/packages/npm_registry/

//gitlab.com/api/v4/packages/npm/:_authToken="<auth-token>"


# Add token for uploading to the registry.

//gitlab.com/api/v4/projects/<project-ID>/packages/npm/:_authToken="<auth-token>"
  1. 运行npm init初始化包
  2. 像这样将 scopepublishConfig 添加到 package.json
{
  "name": "@scope/package-name",
  "version": "0.1.0",
  "main": "index.js", <-- the entry point 
  ...
  "publishConfig": {
    "@scope:registry": "https://gitlab.com/api/v4/projects/<project-ID>/packages/npm/"
  }
}
  1. 运行npm publish

就像我说的,包被上传到我的 GitLab 帐户,在 范围 下很好。我现在唯一的问题是从我的本地仓库运行yarn start 确实会导致空白屏幕。我也意识到纱线不再重定向到http://localhost:3000,而是重定向到http://localhost:3000/scope/repository-name

我在这里错过了什么?

谢谢!

【问题讨论】:

    标签: npm gitlab create-react-app npm-publish npm-package


    【解决方案1】:

    经过大量尝试和错误(甚至更多研究),我终于找到了解决问题的方法。我想指出,我仍然不完全确定为什么会发生某些事情,但希望这个解决方案能帮助他们避免浪费时间。

    目标

    基本上,我想将某些 React 组件 作为 NPM 包 发布到 Gitlab。我在一个包含许多不同 React 组件的项目上工作——其中一些是独立的单页应用程序,而另一些是“应用程序”的一部分。作为应用程序一部分的组件也可能稍后在另一个项目中重用。因此,这使它们有资格被打包。

    每当我开始开发时,我都会从create react app 开始,而且由于 React 应用程序通常是一个单页应用程序,所以打包它并没有什么意义。尽管如此,如果我们想开发一些稍后将成为应用程序一部分的组件,但仍想在本地测试行为,那么这样做是有意义的。

    我将描述如何在 Gitlab 上创建包,但我想它与任何其他存储库托管服务的工作方式相同(除了身份验证和范围的详细信息)。

    设置

    我们从设置我们的 React 应用开始

    npx create-react-app react-package
    

    安装完所有内容后,导航到应用程序文件夹cd react-package 并开始开发组件。对于我们的示例,我们在 src 文件夹内创建一个文件夹,名为 PackagedComponent,其中将包含两个文件 PackagedComponent.jsxindex.js

    我们的组件将非常简单

    import React from 'react`;
    
    export const PackagedComponent = () => {
      return (
        <h1>This is my packaged component!</h1>
      );
    }
    

    index.js 将作为起点

    export { PackagedComponent } from './PackagedComponent';
    
    

    接下来我们要做的是在 Gitlab 上创建一个存储库,并将其链接到我们刚刚创建的项目。然后我们在应用程序的根目录中创建一个.npmrc 文件。这是可选的,但我觉得这很容易,因为在 Gitlab 上有一个很好的 documentation 。我的.npmrc 文件看起来像这样

    # Add token for uploading to the registry. Replace <your_project_id>
    # with the project you want your package to be uploaded to.
    # The auth toke is only necessary if you have a private package
    
    //gitlab.com/api/v4/projects/< your_project_id>/packages/npm/:_authToken="< your_auth_token>"
    

    接下来我们要做的是为项目创建package.json,因此我们这样做了

    npm init
    

    暂时使用所有标准选项。

    包装

    现在是时候进行实际的构建和打包了。首先,我们必须安装更多的开发依赖项,它们将为我们进行转译(我不会解释所有这些,但请查看here 以获取更多信息)

    npm i --save-dev babel-cli babel-preset-env babel-preset-react babel-preset-stage-0
    

    现在我们必须修改package.json。首先删除该行

    "private: true"
    

    然后替换构建命令

    "scripts": {
      "build": "rm -rf dist && NODE_ENV=production npx babel src/PackagedComponent --out-dir dist --copy-files",
      ...
    },
         
    

    然后添加行

    "main": "dist/index.js",
    "module": "dist/index.js",
    "files": "/dist",
    "babel": {
       "presets": [ "react", "env", "stage-0" ]
    }
    

    更改name 以适应范围。就我而言,我创建了一个包含我的packaged-component 项目的组。在这种情况下,组名是范围@group-name/packaged-component-package

    "name": "@group-name/packaged-component-package",
    

    Gitlab 需要 publishConfig 所以我们必须添加

    "publishConfig": {
      "@group-name:registry": "https://gitlab.com/api/v4/projects/<your_project_id>/packages/npm/"
    }
    

    小心你得到scopeproject id的权利!

    现在我们只需要安装缺少的包

    npm i
    

    运行构建命令

    npm run build
    

    并发布到 Gitlab

    npm publish
    

    如果一切顺利,你应该会在 Gitlab 上的 Packages & Registries 下看到你的包。

    将组件添加到另一个应用程序

    现在我们想在另一个应用程序中使用我们打包的组件。我们可以再次运行npx create-react-app test-app。在 app 目录中再次添加 .npmrc

    # Set URL for your scoped packages.
    @group-name:registry=https://gitlab.com/api/v4/packages/npm/
    
    # Add the token for the scoped packages URL. This will allow you to download
    # `@foo/` packages from private projects.
    # You only need this if the package is private
    //gitlab.com/api/v4/packages/npm/:_authToken="<your_auth_token>"
    

    完成后运行npm i,您的组件应出现在@group-name/packaged-component-package 下的node_modules 目录中。

    然后打开App.js并添加行

    import './App.css';
    
    // import the packaged component
    import { PackagedComponent } from '@group-name/packaged-component-package';
    
    function App() {
      return (
        <div className="App">
          <PackagedComponent />
          <header className="App-header">
            <img src={logo} className="App-logo" alt="logo" />
            <p>
              Edit <code>src/App.js</code> and save to reload.
            </p>
            <a
              className="App-link"
              href="https://reactjs.org"
              target="_blank"
              rel="noopener noreferrer"
            >
              Learn React
            </a>
          </header>
        </div>
      );
    }
    
    export default App;
    

    理想情况下,您应该看到以下屏幕

    希望这有帮助!

    【讨论】:

    • 只需更新目标项目中的 .npmrc 文件。而不是:“@group-name:registry=gitlab.com/api/v4/packages/npm”,您应该更改为:“@group:registry=gitlab.com/api/v4/projects/your-project-id/packages/npm
    • 首先group-name 只是您的项目所属组的占位符 - 所以它可以是任何东西。其次,将其更改为 group 并不能解决上述任何问题 - 答案按预期工作,无论 groupgroup-name 或您为组选择的任何其他名称。
    猜你喜欢
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    • 2021-05-18
    • 2017-02-09
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    相关资源
    最近更新 更多