从不同的目录运行早午餐并使用相对路径

Posted

技术标签:

【中文标题】从不同的目录运行早午餐并使用相对路径【英文标题】:Run brunch from different directory and use relative paths 【发布时间】:2017-10-03 06:03:35 【问题描述】:

我们希望在多个项目中使用相同的构建系统。我有一个工作早午餐配置文件,我想把它放在一个 git 子模块中,以便可以在多个项目中引用该子模块并且更改很容易传播(比复制和粘贴更脆弱,并设置 brunch-config.js 的权威来源) .

将 brunch-config.js 放在 git 子模块中会导致我的文件夹结构最终如下:

WebApp // git root
|---Brunch-Build-System // git submodule
|   |---brunch-config.js
|---node_modules
|---source // all the source code I want compiled

Brunch 假设 brunch-config.js 与正在编译的源处于相同或更高的级别。在此设置中,情况并非如此。我尝试修改我的 brunch-config.js 以使用相对路径无济于事。这是我目前的早午餐配置的files 块,没有任何相对路径尝试:

files: 
  javascripts: 
    joinTo: 
      'js/lib.js': /^(?!source\/)/
    ,
    entryPoints: 
      'source/scripts/app.jsx': 
        'js/app.js': /^source\//
      ,
    
  ,
  stylesheets: joinTo: 'css/core.css'

在给定上述所需文件夹结构的情况下,如何修改它以使用相对路径?这甚至可能吗?

【问题讨论】:

AFIK,Brunch 支持相对路径。您是否在其他操作系统上尝试过? 我没有,但我们要求它在 Windows 上运行,这是我尝试过的。我如何将相对路径集成到现有的正则表达式中? @JohannesFilter 嗨,斯科特,你看我的回答了吗? 【参考方案1】:

子模块需要与父 repo 中的根文件夹相关联:它是 gitlink(special entry in the main repo index)记录了该子模块签出的 SHA1。

在您的情况下,最好在post-checkout hook 中使用一个脚本,以确保以下之间存在符号链接

brunch-config.js 在正确的位置和 来自子模块的Brunch-Build-System / brunch-config.js

要包含在钩子中的行将类似于

#!/bin/bash

if [ ! -e /correct/path/for/brunch-config.js ]; then
  ln -s /correct/path/for/brunch-config.js Brunch-Build-System/brunch-config.js
fi

虽然 OP 在 Windows 上:

我最终只是以编程方式复制文件并 gitignoreing 复制的文件

【讨论】:

您能否包括我将放入结帐后挂钩中以制作符号链接的行? @ScottH 我已经编辑了答案,并了解了钩子的外观 谢谢,但是在 Windows 10 上使用它时,它似乎复制了文件,而不是像 mklink 那样创建符号链接。有什么想法吗?我还必须切换ln 命令的参数顺序。 如果您以管理员身份运行 mklink,您就可以实际使用它了。如果没有,请使用 mklink /J。 我在使用 mklink 作为 bash 脚本的一部分时遇到了问题,它显示“找不到命令”。【参考方案2】:

一般来说,brunch 支持相对路径。但是为了使它工作,你必须首先确保其他文件夹是watched。见this part in the docs。对于您的情况,请将其添加到您的配置中。

paths = 
  watched: ['../source', '../node_modules'],

然后在正则表达式前面加上..\/

joinTo: 
  'js/lib.js': /^..\/(?!source\/)/
,
entryPoints: 
  'source/scripts/app.jsx': 
    'js/app.js': /^..\/source\//
  ,

除了正则表达式,您还可以编写一个将路径作为参数的函数,并且必须返回是否应该包含路径。见this part in the docs。

【讨论】:

我刚要试试这个,它提示我有一个包含早午餐库的 package.json。这需要在子模块中安装早午餐 npm 包。 Brunch 构建运行了一段时间,说它正在编译,但最终我遇到了“JavaScript heap out of memory”错误。 等等,你想让package.json 在子模块之外,对吧? 似乎为了使其工作,package.jsonnode_modules 必须在子模块文件夹中,因为您无法更改默认 node_modules 位置:***.com/questions/26293049/…

以上是关于从不同的目录运行早午餐并使用相对路径的主要内容,如果未能解决你的问题,请参考以下文章

Nodejs读取文件时相对路径的正确写法(使用fs模块)

Vscode的相对路径读取问题及处理

浅谈nodejs文件操作中的相对路径问题

关于相对路径和绝对路径

Python:计算从一个目录到另一个目录的相对路径

Python 导入相对路径