使用发布复制文件夹和包

时间:2018-03-23 16:33:19

标签: javascript node.js npm node-modules npm-scripts

有没有办法将package.json(在File字段中)的文件包含到文件夹中,以便将它们与npm publish打包在一起?

我的回购:

.
├── package.json
└── folder0
    ├── file0
    └── folder1
       └── file1

我的package.json:

{
  "name": "example",
  "version": "0.2.0",
  "files": [
    "folder0/file0",
    "folder0/folder1/file1"
  ],
  "author": "cruiz"
}

期望的输出:

我想要我的包裹:

.
├── package.json
└── build
    ├── file0
    └── file1

编辑:

非常感谢您的回复。我试图使用npm来打包VHDL代码,所以我真的很棒:(

是否可以将文件打包在package.json的字段中并从脚本中读取它们?

 
{ 
  "name": "example",
  "version": "0.2.0",
  "customField": [
    "folder0/file0",
    "folder0/folder1/file1"
  ],
  "scripts": {
    "prepublishOnly": "mkdirp build && copyfiles -f [..read CustomField...] build"
  },
  "author": "cruiz"
}

2 个答案:

答案 0 :(得分:0)

你基本上想要的是构建步骤。您可以在{ "scripts": { "prepublish": "mkdir -p build && cp folder0/file0 folder0/folder1/file1 build" } } 脚本中执行所有这些操作,例如:

<强>的package.json

files

但您也应该更改build,除非您真的想要两个结构,folder0/*session

答案 1 :(得分:0)

修订答案:

根据OP的编辑进行编辑。

  

是否可以将文件打包在package.json字段中并从脚本中读取它们。

是的,这是可能的,但是您需要使用自定义节点脚本来执行此操作。我知道没有可用于实现此目的的现有软件包。

<强>解决方案:

  1. 首先,cd到您的项目目录并卸载我在原始答案中提到的软件包,因为我们不会使用它们。您可以通过运行以下命令来执行此操作:

    npm un -D mkdirp copyfile
    
  2. 使用以下命令安装shelljs

    npm i -D shelljs
    

    注意shelljs现在将使用mkdirpcopyfile来创建目录,然后复制package.json中列出的文件。

  3. 接下来创建一个包含以下内容的节点脚本。让我们将文件命名为copy-files.js并将其保存到项目目录顶层名为.scripts的隐藏目录中。即。

    目录结构

    project
    ├── .scripts
    │   └── copy-files.js
    ├── node_modules
    │   └── ...
    ├── package.json
    ├── folder0
    │   ├── file0.js
    │   └── folder1
    │      └── file1.js
    └── ...
    

    copy-files.js

    的内容
    const shell = require('shelljs');
    const pkg = require('../package.json');
    
    // The path to the directory to copy the file(s) to.
    const DEST_DIR = './build';
    
    // NOTE: `customField` below should be replaced with the
    // actual key name in the final `package.json`.
    const srcFilePaths = pkg.customField;
    
    // Create a new destination directory and intermediate
    // directories if necessary.
    if (!shell.test('-d', DEST_DIR)) {
      shell.mkdir('-p', DEST_DIR);
    }
    
    // Recursively copy each file listed in the `customField` Array.
    // Logs and error if the file listed cannot be found.
    srcFilePaths.forEach(function (srcPath) {
      if (!shell.test('-e', srcPath)) {
        shell.echo('Error: Cannot find file listed in package.json: %s', srcPath);
        process.exit(1);
      }
      shell.cp(srcPath, DEST_DIR);
    });
    

    注意customField中的const srcFilePaths = pkg.customField;部分(上面copy-files.js的第9行)需要替换为实际的真实密钥名称您决定使用最终package.json

  4. 最后,更新您的prepublishOnly脚本以调用自定义节点脚本(即copy-file.js),如以下package.json摘录所示:

    {
      ...
      "customField": [
        "folder0/file0.js",
        "folder0/folder1/file1.js"
      ],
      "scripts": {
        "prepublishOnly": "node .scripts/copy-files",
      },
      ...
    }
    
  5. 原始答案

    这可以通过在package.json文件中使用自定义npm-script来实现。如上所述,使用pre脚本也符合您的要求:

      

    将它们与npm publish

    打包在一起

    1。使用prepost挂钩与npm脚本:

    所有npm脚本都支持所谓的prepost挂钩。任何pre脚本将在其各自的脚本(或命令)之前运行,并且任何post脚本将在其各自的脚本(或命令)之后运行。

    为了更好地理解这个功能,我们可以说我们的package.json包含以下摘录中显示的人为脚本:

    ...
    "scripts": {
      "prefoo": "...",
      "foo": "...",
      "postfoo": "..."
    },
    ...
    

    如你所见:

    1. 有一个名为foo的脚本,其中包含带有pre前缀的相应脚本,即prefoo
    2. 同样,相同的foo脚本也有另一个相应的脚本,但是这个脚本的前缀是post,即postfoo
    3. 只要通过运行foo通过CLI调用npm run foo脚本,以这种方式指定脚本将导致以下内容:

      1. prefoo脚本将在执行foo脚本之前自动运行。
      2. postfoo将在foo完成后自动运行。
      3. 可以找到有关prepost挂钩的更多信息here

        2。那么我应该使用哪个pre脚本?

        有几个内置的pre脚本可能符合您的要求;那些是prepublishprepublishOnly。 npm docs为这些钩子提供了以下描述:

        •   

          预发布:在打包和发布包之前运行,在没有任何参数的本地npm install上运行。 (见下文)

        •   

          prepublishOnly :在准备和打包包之前运行,仅在npm publish ...

        注意:以下解决方案使用prepublishOnly,因为我确信您不希望在用户运行npm install时运行此脚本。但是,您需要决定是使用它还是将其交换为prepublish。有关每个pre挂钩的详细信息,请参阅docs

        3。溶液

        1. 对于适用于跨平台的解决方案,您首先需要cd到项目目录并安装几个额外的npm包。

          • 运行:npm i -D mkdirp

          • 安装mkdirp
          • 运行:npm i -D copyfiles

          • 安装copyfile
        2. scripts文件的package.json部分添加以下内容:

          ...
          "scripts": {
            "prepublishOnly": "mkdirp build && copyfiles -f folder0/file0.js folder0/folder1/file1.js build"
          },
          ...
          
        3. 现在你跑步的时候; npm run publishprepublishOnly脚本将自动运行(即复制文件以满足您所需的目录结构),然后准备好包并打包发布。

          你当然可以跑; npm run prepublishOnly,如果您想在运行之前测试脚本的结果:npm run publish