我有一组奇怪的“本地”npm模块,它们使用TypeScript并相互依赖,类似于:
A -> B, C
B -> C
C -> D
我需要运行npm install
并按顺序编译我的所有TypeScript编译,否则将无法正确查找内容。我的印象是我应该使用prepublish
脚本来处理TypeScript编译,但它似乎没有级联prepublish
本地依赖的请求。
我应该如何使用prepublish
脚本设置一堆本地模块,以便在运行npm install
时能够正确解析它们?
另一种说出我要问的方法:如何维护多个本地节点模块并同时修改它们?这些模块之间存在不同的依赖关系,单独修改它们非常不方便。
答案 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模块。我必须这样做的原因涉及预先存在的构建系统的细节。
这样做的陷阱:
答案 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文件留在那里,一切都会正常工作。