Git 如何在UI中放置Meteor应用程序的版本号?
我有一个meteor应用程序,它为不同的客户端提供不同的分支。这是因为客户需要特殊的东西。当然对了 我希望能够将该客户端应用程序的部署版本的git分支和标记/哈希放在UI的某个地方 问题是怎么做?在Meteor中有没有一种方法可以获得这些信息并简单地使用它Git 如何在UI中放置Meteor应用程序的版本号?,git,meteor,Git,Meteor,我有一个meteor应用程序,它为不同的客户端提供不同的分支。这是因为客户需要特殊的东西。当然对了 我希望能够将该客户端应用程序的部署版本的git分支和标记/哈希放在UI的某个地方 问题是怎么做?在Meteor中有没有一种方法可以获得这些信息并简单地使用它 谢谢 在我的生产应用程序中,我通过以下方式解决了这个问题: 文件夹 应用程序结构: 每当开发人员提交代码时,都会执行.git/hooks/post commit,该脚本执行存储在App/MeteorApp/hooks/post commi
谢谢 在我的生产应用程序中,我通过以下方式解决了这个问题: 文件夹 应用程序结构: 每当开发人员提交代码时,都会执行.git/hooks/post commit,该脚本执行存储在
App/MeteorApp/hooks/post commit version
中的nodejs脚本
脚本post commit version
以App/MeteorApp/private
dir格式生成version.json
:
{
"timestamp": "29-08-2014 23:16",
"branch": "master",
"commit": "3332f6dcbde57105a8dc353e5e878651cab89856"
}
生产时服务器可以访问存储在private
中的所有内容
如何在应用程序中显示version.json
?
App/MeteorApp/both/collections/Version.js:
Version = new Meteor.Collection('version');
Meteor.publish('version', function () {
return Version.find();
});
Meteor.startup(function(){
Meteor.subscribe("version");
})
App/MeteorApp/server/startup.js
Meteor.startup(function(){
if (Version.find().count() > 0){
Version.remove({});
}
Version.insert(JSON.parse(Assets.getText("version.json")));
})
部署应用程序后,它将触发启动
回调,并将版本插入到集合版本
App/MeteorApp/server/publish/version.js:
Version = new Meteor.Collection('version');
Meteor.publish('version', function () {
return Version.find();
});
Meteor.startup(function(){
Meteor.subscribe("version");
})
App/MeteorApp/client/startup.js:
Version = new Meteor.Collection('version');
Meteor.publish('version', function () {
return Version.find();
});
Meteor.startup(function(){
Meteor.subscribe("version");
})
然后在模板中的某个地方简单地创建帮助器:
Template.template_name.helpers({
version:function(){
return Version.findOne();
}
})
在模板{u name中,使用{{version.commit}
{{version.branch}
{version.timestamp}}
显示版本
旁注1
脚本post-commit-version
没有js
扩展名,因为我不希望meteor每次更改此文件时都将其包含在捆绑包中或重新加载开发中的应用程序。
但是,当文件存储在.dir
(如App/MeteorApp/.hooks
)中时,可以使用post commit version.js
,因为meteor不会处理以
作为第一个字符的目录
旁注2
另一种可能是在服务器端加载version.json
Meteor.startup
,解析json并附加到全局变量,如App.version
。稍后将其与Meteor一起使用。方法:
Meteor.methods({
getVersion:function(){
return App.version;
}
})
在客户端上,您只需调用方法:
Meteor.call("getVersion", function(error,version){
if(error) {
throw new Error("Cannot get version");
return;
}
Session.set("version",version)
})
某些模板的助手可以使用它:
Template.template_name.helpers({
version:function(){
return Session.get("version");
}
})
我刚刚为此写了一个软件包,并在上发布了它。该包附带一个模板帮助器,用于显示git提交哈希、标记或分支,如下所示:
<div>
<p>short hash: {{gitRev 'short'}}</p>
<p>long hash: {{gitRev 'long'}}</p>
<p>tag: {{gitRev 'tag'}}</p>
<p>branch: {{gitRev 'branch'}}</p>
</div>
短哈希:{{gitRev'short'}}
长哈希:{{gitRev'long'}}
标记:{{gitRev'tag'}
分支:{{gitRev'branch'}
有关详细信息,请参阅。在大多数情况下,我喜欢Kuba的答案,实际上我尝试使用他的节点脚本,但在promise库中遇到了问题。无论如何,我写了我自己的post-commit-bash脚本,我认为这样更简洁、更容易
ver=$(git describe --abbrev=0)
complete=$(git describe)
branch=$(git rev-parse --abbrev-ref HEAD)
commit=$(git rev-parse HEAD)
timestamp=$(git log -1 --date=short --pretty=format:%cd)
cat > private/version.json << EOF
{
"basic": "$ver",
"complete": "$complete",
"branch": "$branch",
"commit": "$commit",
"timestamp": "$timestamp"
}
EOF
ver=$(git descripe--abbrev=0)
完成=$(git描述)
分支=$(git rev parse--abbrev ref HEAD)
提交=$(git rev解析头)
时间戳=$(git日志-1--date=short--pretty=format:%cd)
cat>private/version.json根据我在这里看到的内容,我尝试了一种不同的方法,以防任何人也需要从客户端获取版本,下面是一个基于windows的答案:
预提交文件
#!/bin/sh
node auto-version
RETVAL=$?
if [ $RETVAL -ne 0 ]
then
exit 1
fi
exec git add ./pathTo/_version.js
自动版本文件
var execSync = require("child_process").execSync;
var path = require("path");
var fs = require("fs");
var outputFile = path.normalize(__dirname + "/pathTo/_version.js");
var currentVersion = JSON.parse(fs.readFileSync('./pathTo/_version.js', 'utf8').replace("myVar =" , ""));
function parse(cmd) {
var stdout = execSync(cmd, { encoding: "utf8" });
return stdout.replace("* ", "").replace("\n", "");
}
try {
console.log("vers",currentVersion);
var myVar = JSON.stringify(
{
version: currentVersion.version+0.01,
timestamp: new Date(),
branch: parse('git branch | findstr "*"'),
pre_commit: parse("git rev-parse HEAD")
},null,2);
fs.writeFileSync(outputFile, "myVar = " + myVar +"\n");
console.log("Succesfully updated " + outputFile);
} catch(err) {
console.log("Error updating " + outputFile);
console.log(err);
}
初始_version.js文件
myVar = {
"version": 0.00,
}
因此,您只需提交、运行应用程序、打开浏览器控制台并键入myVar.version(当然这只是一个简单的示例)
请注意,提交后_version.js将被标记为已更改,但版本更新实际上已提交,因此忽略正在标记的文件。
您可以使用Kuba Wyrobek提供的post-commit技术来完成此方法,以获得post-commit git版本(在我的情况下,知道前面的版本就足够了)。您可以在客户端和服务器上使用Meteor.gitCommitHash
。感谢您的想法,但我觉得您的post-commit版本脚本过于复杂。我把它浓缩成。请注意,我用findstr替换了grep,因为我在windows上。@Gigo您的想法似乎简单多了。非常感谢。我喜欢这种方法,但它不会导致version.json总是在最后一次提交之后提交一次吗?它对我来说就是这样,在这里找到了解决方案:(用bitluck回答)不是真的。。。当然,version.json
是在提交后钩子中生成的,它不包括在提交中(不可能吃蛋糕和吃蛋糕,对吧),但是当你部署你的应用程序时,它将包括version.json
,其中包含实际数据。我通常把version.json
放在新的变更列表(称为version)中,所以它很少被提交。@Kubawyrobk我写了一个要点,只为你…:-)我想我有一个依赖问题。我在模板helper中得到:Exception:ReferenceError:check未在…/johdirr\u meteor-git-rev.js:70:3中定义这是否有文档记录?我只发现这张PR没有“记录”每说(因为名称是明确的)。你可以在Meteor changelog上找到它: