我正在为我们的CI进程使用MSBuild,我正在试图找到一种方法来获得文件系统层次结构中更高的文件夹的文件夹名称。此文件夹将保存CI的所有工具。
我要找的文件夹可以在每台电脑的不同位置。
假设MSBuild脚本在D:WorkdirBlaBlaProject1中执行,我感兴趣的文件夹是D:WorkdirCI
我希望脚本按照如下方式遍历文件系统:
- 查看当前目录(D:WorkDirBlaBlaProject1),检查CI文件夹(未找到)
- 进入层次结构(D:WorkdirBlaBla)并检查CI文件夹(未找到)
- 再次打开(D:Workdir)并检查CI文件夹(找到了!)
这在MSBuild中可行吗?
指出
为了澄清,我想在一个属性中获得结果(文件夹的位置)。
这是我到目前为止所做的,并试图更好;)
<PropertyGroup>
<CI_PathName Condition=" Exists ('..CI') ">..CI</CI_PathName >
<CI_PathName Condition=" Exists ('....CI') ">....CI</CI_PathName >
<CI_PathName Condition=" Exists ('......CI') ">......CI</CI_PathName >
</PropertyGroup>
您可以使用内联任务:
<?xml version="1.0" encoding="utf-8" ?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<UsingTask
TaskName="FindParentDirectory"
TaskFactory="CodeTaskFactory"
AssemblyFile="$(MSBuildToolsPath)Microsoft.Build.Tasks.v4.0.dll">
<ParameterGroup>
<BaseDirectory ParameterType="Microsoft.Build.Framework.ITaskItem" Required="true" />
<TargetDirectoryName ParameterType="System.String" Required="true" />
<TargetDirectory ParameterType="System.String" Output="true" />
</ParameterGroup>
<Task>
<Using Namespace="System.IO" />
<Code Type="Fragment" Language="cs">
<![CDATA[
string baseDirectoryPath = BaseDirectory.GetMetadata("FullPath");
DirectoryInfo baseDirectory = new DirectoryInfo(baseDirectoryPath);
DirectoryInfo[] childDirectories = baseDirectory.GetDirectories(TargetDirectoryName);
if (childDirectories.Length == 1)
{
TargetDirectory = childDirectories[0].FullName;
return true;
}
while (baseDirectory != baseDirectory.Root)
{
baseDirectory = baseDirectory.Parent;
if (baseDirectory.Name == TargetDirectoryName)
{
TargetDirectory = baseDirectory.FullName;
return true;
}
childDirectories = baseDirectory.GetDirectories(TargetDirectoryName);
if (childDirectories.Length == 1)
{
TargetDirectory = childDirectories[0].FullName;
return true;
}
}
Log.LogError("Unable to find recursively find a directory called '{0}' in a parent of '{1}'.", TargetDirectoryName, baseDirectoryPath);
return false;
]]>
</Code>
</Task>
</UsingTask>
<Target Name="Build">
<FindParentDirectory
BaseDirectory="$(MSBuildProjectDirectory)"
TargetDirectoryName="Development">
<Output
TaskParameter="TargetDirectory"
PropertyName="TargetDir" />
</FindParentDirectory>
<Message
Text="TargetDir = '$(TargetDir)'"
Importance="high" />
</Target>
是的,您可以使用"Exec"标签并在MS Build的任何目标中设置其"Command"属性。以文本模式打开项目文件,您可以在目标中添加您可能想要的命令(例如,目标"BeforeBuild",如果您希望脚本在构建之前执行)
编辑:以文本模式打开项目文件,导航到:
<Target Name="BeforeBuild">
<Exec Command="yourscript or any DOS command" />
... if you had anything before in this section leave them as is
</Target>