在整个项目上运行npm prepublish

时间:2015-10-20 14:48:19

标签: npm typescript

我有一组奇怪的“本地”npm模块,它们使用TypeScript并相互依赖,类似于:

A -> B, C
B -> C
C -> D

我需要运行npm install并按顺序编译我的所有TypeScript编译,否则将无法正确查找内容。我的印象是我应该使用prepublish脚本来处理TypeScript编译,但它似乎没有级联prepublish本地依赖的请求。

我应该如何使用prepublish脚本设置一堆本地模块,以便在运行npm install时能够正确解析它们?

另一种说出我要问的方法:如何维护多个本地节点模块并同时修改它们?这些模块之间存在不同的依赖关系,单独修改它们非常不方便。

3 个答案:

答案 0 :(得分:0)

  

TypeScript编译,但它似乎没有级联本地依赖项的预先发布请求。

确实,preublish只运行依赖项的安装。在将它们放在NPM上并安装之前,应该已经构建了依赖项(使用prepublish)。

答案 1 :(得分:0)

我想出了如何做我需要的事情。在更新到npm 3.3.9和TypeScript 1.6后,我能够使用using Sitecore; using Sitecore.Data.Items; ... public static bool IsImage(Item item) { if (item.TemplateID == TemplateIDs.VersionedImage || item.TemplateID == TemplateIDs.UnversionedImage) { return true; } foreach (TemplateItem baseTemplate in item.Template.BaseTemplates) { if (IsImage(baseTemplate)) { return true; } } return false; } 脚本动态构建内容。原型生活在这里:https://github.com/MrHen/TypeScriptNpm

但重要的是:

postinstall

// In the module's package.json
"scripts": {
  "build": "gulp npmbuild",
  "postinstall": "npm run build"
},

// In the server's package.json
"dependencies": {
  "hen-doodad": "file:../modules/hen-doodad",
  "hen-widget": "file:../modules/hen-widget"
}

感觉有点像黑客,但这比// In the gulpfile gulp.task('npmbuild', function() { gulp_util.log('Detecting appropriate starting directory...', process.env.INIT_CWD); var out = process.env.INIT_CWD + '/app'; var build = [process.env.INIT_CWD + '/**/*.ts', 'typings/tsd.d.ts', '!' + process.env.INIT_CWD + '/node_modules/**/*']; var typings = 'typings/tsd.d.ts'; // ... do typescript build using above paths 更有效。要运行整个事情,请在服务器文件夹中执行prepublish

gulp任务是可选的。大概你可以直接使用npm install

应该注意的是,这肯定是你应该如何打包npm模块。我必须这样做的原因涉及预先存在的构建系统的细节。

这样做的陷阱:

  • 不符合npm使用的标准发布模式。
  • 构建的文件只存在于服务器的nod​​e_modules内部,这可能很麻烦,具体取决于你用它们做了什么。
  • 运行npm install两次将抓取最新更改。您需要删除已安装的模块或更新模块上的版本号。
  • 每个模块都有自己的TypeScript构建,而不是构建集体。如果您可以一次性构建所有内容,则应该这样做。
  • 由于它们如何自动检测node_modules中包含的打字文件,因此需要TypeScript 1.6或更高版本。

答案 2 :(得分:0)

假设您使用的是支持节点模块分辨率的TypeScript 1.6+。当你试图保持所有模块同步时,我想你的项目才刚刚开始。

我认为符号链接可以完成这项工作,但如果您有更多疑虑,请告诉我。

更具体地说,您可以手动创建符号链接或利用npm link的优势。

cd /path-of-a-module
npm link # this will create a link as global module
cd /path-of-your-app
npm link your-module-name

然后你可以愉快地维护这些模块。

对于package.json文件中的依赖项配置,它可能是一个git存储库。但你可能会把已编译的* .js和* .d.ts文件留在那里,一切都会正常工作。