关于接受答案的说明:由于强有力的间接证据,我接受了答案.尽管如此,这是间接的证据,所以要带上一粒盐.
当用户运行插件目标而不是生命周期阶段时,如何触发插件?(之前已经问过,但答案是使用生命周期阶段.)
例证:我需要release:branch调用regex-plugin以生成一个当前版本作为其名称的分支,减去-SNAPSHOT后缀.这就是我所拥有的,它要求开发人员激活配置文件并调用verify阶段.我需要开发人员简单地调用release:branch,这反过来应该导致regex-plugin运行.与Gitflow有点结婚.
<profile>
<id>Release Branch</id>
<build>
<plugins>
<!-- On validate, compute the current version without -SNAPSHOT. -->
<!-- Put the result in a property. -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.7</version>
<executions>
<execution>
<phase>validate</phase>
<goals>
<goal>regex-property</goal>
</goals>
<configuration>
<value>${project.version}</value>
<regex>^(.*)-SNAPSHOT$</regex>
<replacement>$1</replacement>
<name>project.unqualifiedVersion</name>
</configuration>
</execution>
</executions>
</plugin>
<!-- Also on validate, run the branch plugin, and use -->
<!-- the non-SNAPSHOT version thus computed in the …Run Code Online (Sandbox Code Playgroud) 如何以编程方式完成另一个命令的完成?
假设我当前的目录有文件a1,a2然后a3,我怎样才能让我的命令调用自动完成ls a回来a1 a2 a3?
这可能吗?
澄清和理由:
我选择ls是因为人们可以与之相关.这是一个人为的例子,但让我试着举例说明这个功能的价值.我有一个命令build,在给定目录的情况下,可以自动完成可以在该目录中构建的目标.这些目标可能与该目录中的文件不对应.目标可能是由build我不想解析的构建文件中的命令挖掘的.换一种说法:
build path/to/dir/TABTAB
可能会给:
path/to/dir/a_target
path/to/dir/b_target
Run Code Online (Sandbox Code Playgroud)
build是一个预先存在的命令,而不是我可以继续修改以适应我的目的.它提取目标的方式是我当然不想知道的.
现在假设我有一个完整的build能力项目存储库,而且我的大部分工作都是因为我的大部分build工作只在一个项目中进行.换句话说,我总是build有一些目标my/project/directory.
到现在为止还挺好.
所以我想编写一个围绕build命令的包装器,它不需要我每次运行它时都将它提供给目录路径.我希望它知道我的首选项目目录(或目录,为什么不),让我引用目标而不限定它们:
所以假设我有:
my/project/directory/a_target
my/project/directoryb_target
Run Code Online (Sandbox Code Playgroud)
我要这个:
mybuildTABTAB
给我:
a_target
b_target
Run Code Online (Sandbox Code Playgroud)
当然我需要为其编写完成代码mybuild,但是我希望它依赖于完成代码build,因为我不能只是去请求开发人员build编写build listtargets命令只是为了让我开心.该功能已经存在,在完成时build,我需要利用它.
(当然,当我运行时mybuild a_target,它会知道运行build my/project/directory/a_target,并且我知道如何实现,并且不在这个问题的范围内.)
我希望这说明了为什么我需要完成build命令并将其用作黑盒子.
如何在不实际过滤或突出显示的情况下进行 grep 操作?
目标是找出特定文本是否在输出中,而不影响输出。我可以tee访问一个文件,然后离线检查该文件,但是,如果输出很大,那就浪费时间,因为它仅在过程完成后才处理输出:
command | tee file
file=`mktemp`
if grep -q pattern "$file"; then
echo Pattern found.
fi
rm "$file"
Run Code Online (Sandbox Code Playgroud)
我想我也可以使用 grep 的 before ( -B) 和 after ( -A) 标志来实现实时处理,但如果没有匹配,则不会输出任何内容。
# Won't even work - DON'T USE.
if command | grep -A 1000000 -B 1000000 pattern; then
echo Pattern found.
fi
Run Code Online (Sandbox Code Playgroud)
有更好的方法来实现这一目标吗?类似于“假装您正在 grep 并设置退出代码,但不要 grep 任何内容”。
(实际上,我要做的是通过管道传输 stderr,因为我正在寻找某个错误,所以command | ...我将使用来代替command 2> >(... >&2; result=${PIPESTATUS[*]}),它实现了相同的效果,只是它适用于 stderr。)
我们在内部使用Maven和Subversion.我们还使用Maven的Release插件.我们在执行以下(正确的,我假定的)步骤时注意到了下面描述的问题.
1.我们经营release:prepare:
1.0.0.svn copy trunk/myproject tags/myproject-1.0.0,从而创建标签myproject-1.0.0.1.0.1-SNAPSHOT.2.我们经营release:rollback:
1.0.0-SNAPSHOT.3,我们承诺更多的变化干路,显然针对的版本1.0.0-SNAPSHOT.
4.我们跑release:prepare一次:
1.0.0.svn copy trunk/myproject tags/myproject-1.0.0,认为它创建myproject-1.0.0了最新主干的标签.但是,唉,Subversion(1.6和1.7一样)将代替tags/myproject-1.0.0/myprojectMaven 创建.5.我们经营release:perform:
myproject-1.0.0.问题很明显:步骤3中的更改未使其成为标记.我们现在正在发布1.0.0而没有改变它.
问题是:我们如何解决这个问题?Maven的发布回滚功能本身是否已损坏?