使用 Grunt + Git 为 JavaScript 项目构建增量更新的工作流
Workflow for building incremental updates for a JavaScript project with Grunt + Git
抱歉,我无法定义一个标题来说明我的问题。但我会尝试在这里解释我的问题:
我们在 JavaScript 项目中使用 Grunt 将 Sass 文件编译为 CSS 并浏览和缩小我们的 JavaScript 模块。
Sass 和 JavaScript 源位于多个文件夹中(每个 app-module 一个),文件夹结构如下:
src/
styles/
base.scss
style.scss
js/
module1.js
module2.js
app.js
Grunt 任务将这个文件编译成这个结构:
dist/
styles/
style.css
js/
app.js
dist
下的所有文件都被 Git 忽略。
当我们部署我们的应用程序时,我们会创建增量更新,这基本上是一个 git diff --name-only
来获取已更改文件的列表。
我的问题来了:当我部署应用程序时,我将不得不构建所有 JavaScript 和 Sass 文件。由于编译后的文件在 Git 之外,我不知道这些文件中有哪些发生了变化(与最新版本相比)。
我想到的唯一解决方案是将已编译的 CSS 和 JavaScript 文件也添加到 Git。但随后我们将不得不与这些文件中的合并冲突作斗争。
有什么想法或经验可以优化这个工作流程吗?
2017-09-19更新:
我已将标题更改为更准确,因为我正在搜索的是一个在使用 Grunt 和 Git.
的 JavaScript-project 上构建增量更新的工作流
您不应将已编译的文件保存在您的存储库中 - 这样做没有任何意义。它只会导致合并冲突并在提交历史中造成混乱。您应该跟踪所有必要的源文件和配置文件,以便任何人都可以从历史的任何时间点轻松构建。如果你这样做,那么你的问题就归结为
git checkout newVersion
<build>
git checkout oldVersion
<build>
diff newBuild oldBuild
根据@Dunno 的回答,现在创建更新的工作流程如下:
增量更新
- 在
git-archive
的帮助下将 HEAD
签入临时目录
- 使用
grunt
构建项目
- 在
git-archive
的帮助下将 HEAD
(HEAD^
) 之前的 Commit 签入临时目录
- 使用
grunt
构建项目
- 在
git-diff --no-index
的帮助下比较两个目录(允许比较没有索引的目录中的文件)
- 在
tar
和 gzip
的帮助下将这些差异存储到存档中,忽略 src
个文件夹中的所有文件
全部更新
- 在
git-archive
的帮助下将 HEAD
签入临时目录
- 使用
grunt
构建项目
- 在
tar
和 gzip
的帮助下将所有项目文件存储到存档中,忽略 src
个文件夹中的所有文件
git-diff --no-index
的使用真的是救命恩人,因为 diff
和 rsync
都无法以我需要的方式报告更改。
抱歉,我无法定义一个标题来说明我的问题。但我会尝试在这里解释我的问题:
我们在 JavaScript 项目中使用 Grunt 将 Sass 文件编译为 CSS 并浏览和缩小我们的 JavaScript 模块。
Sass 和 JavaScript 源位于多个文件夹中(每个 app-module 一个),文件夹结构如下:
src/
styles/
base.scss
style.scss
js/
module1.js
module2.js
app.js
Grunt 任务将这个文件编译成这个结构:
dist/
styles/
style.css
js/
app.js
dist
下的所有文件都被 Git 忽略。
当我们部署我们的应用程序时,我们会创建增量更新,这基本上是一个 git diff --name-only
来获取已更改文件的列表。
我的问题来了:当我部署应用程序时,我将不得不构建所有 JavaScript 和 Sass 文件。由于编译后的文件在 Git 之外,我不知道这些文件中有哪些发生了变化(与最新版本相比)。
我想到的唯一解决方案是将已编译的 CSS 和 JavaScript 文件也添加到 Git。但随后我们将不得不与这些文件中的合并冲突作斗争。
有什么想法或经验可以优化这个工作流程吗?
2017-09-19更新: 我已将标题更改为更准确,因为我正在搜索的是一个在使用 Grunt 和 Git.
的 JavaScript-project 上构建增量更新的工作流您不应将已编译的文件保存在您的存储库中 - 这样做没有任何意义。它只会导致合并冲突并在提交历史中造成混乱。您应该跟踪所有必要的源文件和配置文件,以便任何人都可以从历史的任何时间点轻松构建。如果你这样做,那么你的问题就归结为
git checkout newVersion
<build>
git checkout oldVersion
<build>
diff newBuild oldBuild
根据@Dunno 的回答,现在创建更新的工作流程如下:
增量更新
- 在
git-archive
的帮助下将 - 使用
grunt
构建项目
- 在
git-archive
的帮助下将 - 使用
grunt
构建项目
- 在
git-diff --no-index
的帮助下比较两个目录(允许比较没有索引的目录中的文件) - 在
tar
和gzip
的帮助下将这些差异存储到存档中,忽略src
个文件夹中的所有文件
HEAD
签入临时目录
HEAD
(HEAD^
) 之前的 Commit 签入临时目录
全部更新
- 在
git-archive
的帮助下将 - 使用
grunt
构建项目
- 在
tar
和gzip
的帮助下将所有项目文件存储到存档中,忽略src
个文件夹中的所有文件
HEAD
签入临时目录
git-diff --no-index
的使用真的是救命恩人,因为 diff
和 rsync
都无法以我需要的方式报告更改。