Лучшим решением для C # / всех статических языков .NET является использование CodeDOM для таких вещей. (В качестве примечания, его другая основная цель заключается в динамическом построении битов кода или даже целых классов.)
Вот хороший пример из блога LukeH , который использует некоторые LINQ тоже просто для удовольствия.
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
class Program
{
static void Main(string[] args)
{
var csc = new CSharpCodeProvider(new Dictionary() { { "CompilerVersion", "v3.5" } });
var parameters = new CompilerParameters(new[] { "mscorlib.dll", "System.Core.dll" }, "foo.exe", true);
parameters.GenerateExecutable = true;
CompilerResults results = csc.CompileAssemblyFromSource(parameters,
@"using System.Linq;
class Program {
public static void Main(string[] args) {
var q = from i in Enumerable.Range(1,100)
where i % 2 == 0
select i;
}
}");
results.Errors.Cast().ToList().ForEach(error => Console.WriteLine(error.ErrorText));
}
}
Класс первостепенной важности здесь - CSharpCodeProvider
, который использует компилятор для компиляции кода «на лету». Если вы хотите запустить код, вам просто нужно использовать немного отражения для динамической загрузки сборки и ее выполнения.
Здесь - еще один пример на C #, который (хотя чуть менее кратким) дополнительно показывает вам, как запустить исполняемый код во время выполнения, используя пространство имен System.Reflection
.
Вы можете просто сделать:
git log --oneline --decorate v0.1.0
... чтобы показать каждый коммит вплоть до v0.1.0 включительно. Конечно, git log
позволяет также ограничивать коммиты, показанные любым из способов, которые понимает git rev-list
, поэтому, если вы хотите увидеть только изменения между v0.0.9
и v0.1.0
, вы также можете сделать:
git log --oneline --decorate v0.0.9..v0.1.0
Альтернативным выходом, который может быть полезен для этой цели, является git shortlog
, в котором группируются и суммируются вклады каждого автора. Попробуйте, например:
git shortlog v0.1.0
Просто добавьте tagname
к вашей команде, и с вами все будет в порядке :) Мне нравится переключатель --graph
, чтобы визуализировать ветви, которые привели к этому тегу:)
Обновление скрипта, предложенного Creotiv для улучшения сортировки тегов
#!/bin/bash
# Author:Andrey Nikishaev, Gunnar Lindholm
echo "CHANGELOG"
echo ----------------------
git for-each-ref --sort='*authordate' --format='%(tag)' refs/tags |tac |grep -v '^ | while read TAG ; do
echo
if [ $NEXT ];then
echo [$NEXT]
else
echo "[Current]"
fi
GIT_PAGER=cat git log --no-merges --format=" * %s" $TAG..$NEXT
NEXT=$TAG
done
FIRST=$(git tag -l | head -1)
echo
echo [$FIRST]
GIT_PAGER=cat git log --no-merges --format=" * %s" $FIRST
Вы можете использовать Git Changelog Command Line , чтобы сделать это:
npx git-changelog-command-line -std -tr v0.1.0 -tec "
# Changelog
Changelog for {{ownerName}} {{repoName}}.
{{#tags}}
## {{name}}
{{#issues}}
{{#hasIssue}}
{{#hasLink}}
### {{name}} [{{issue}}]({{link}}) {{title}} {{#hasIssueType}} *{{issueType}}* {{/hasIssueType}} {{#hasLabels}} {{#labels}} *{{.}}* {{/labels}} {{/hasLabels}}
{{/hasLink}}
{{^hasLink}}
### {{name}} {{issue}} {{title}} {{#hasIssueType}} *{{issueType}}* {{/hasIssueType}} {{#hasLabels}} {{#labels}} *{{.}}* {{/labels}} {{/hasLabels}}
{{/hasLink}}
{{/hasIssue}}
{{^hasIssue}}
### {{name}}
{{/hasIssue}}
{{#commits}}
**{{{messageTitle}}}**
{{#messageBodyItems}}
* {{.}}
{{/messageBodyItems}}
[{{hash}}](https://github.com/{{ownerName}}/{{repoName}}/commit/{{hash}}) {{authorName}} *{{commitTime}}*
{{/commits}}
{{/issues}}
{{/tags}}
"