.net ItemGroup中的MSBuild通配符有时扩展,有时不扩展';T

.net ItemGroup中的MSBuild通配符有时扩展,有时不扩展';T,.net,jenkins,msbuild,.net,Jenkins,Msbuild,我有一个msbuild脚本,我正试图通过jenkins运行该脚本,基于通配符扩展,它有时成功,有时失败。这是脚本的主体: <?xml version="1.0" encoding="utf-8"?> <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="FinalCopy"> <PropertyGroup> <Configura

我有一个msbuild脚本,我正试图通过jenkins运行该脚本,基于通配符扩展,它有时成功,有时失败。这是脚本的主体:

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="FinalCopy">
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Dev</Configuration>
    <BuildPlatform Condition=" '$(BuildPlatform)' == '' ">Any CPU</BuildPlatform>
    <DeployDir>$(MSBuildThisFileDirectory)Deploy_$(Configuration)</DeployDir>
    <BuildOutput>$(DeployDir)\Build_Output</BuildOutput>
    <AdminDir>$(DeployDir)\Admin</AdminDir>
    <TempDir>$(DeployDir)\Temp</TempDir>
    <SolutionFile>$(MSBuildThisFileDirectory)MyApplication.sln</SolutionFile>
    <NUnitConsole>C:\Program Files\NUnit 2.6.3\bin\nunit-console.exe</NUnitConsole>
    <AdminConfigLocation>$(ConfigRepo)\Admin\$(Configuration)</AdminConfigLocation>
    <WebConfig>$(AdminConfigLocation)\Web.config</WebConfig>
  </PropertyGroup>

  <ItemGroup>
    <TestConfigs Include="$(AdminConfigLocation)\MyApplication.*.Tests.dll.config" />
    <TestResultsPath Include="$(DeployDir)\TestResults.xml" />
    <ProjectsToBuild Include="$(SolutionFile)">
        <AdditionalProperties>
            VisualStudioVersion=$(VisualStudioVersion);
            Configuration=$(Configuration);
            OutputPath=$(BuildOutput);
            WebPublishMethod=FileSystem;
            publishUrl=$(TempDir);
            DeleteExistingFiles=True;
            DeployOnBuild=True;
            DeployTarget=WebPublish;
            PublishProfile=$(MSBuildThisFileFullPath);
            Platform=$(BuildPlatform)
        </AdditionalProperties>
    </ProjectsToBuild>
  </ItemGroup>
  <ItemGroup>
     <TestDlls Include="$(BuildOutput)\MyApplication.*.Tests.dll" />
  </ItemGroup>
  <Target Name="FinalCopy" DependsOnTargets="RunUnitTests">
    <Message Text="Moving files to final destination" Importance="high" />
    <Exec Command='move "$(TempDir)" "$(AdminDir)"' />
    <Message Text="Finished moving files to final destination" Importance="high" />
  </Target>

  <!-- This target runs the unit tests and publishes the results -->
  <Target Name="RunUnitTests" DependsOnTargets="CopyTestConfigs">
    <Exec Command='"$(NUnitConsole)" "%(TestDlls.Identity)" /xml="@(TestResultsPath)"' />
  </Target>

  <!-- This target copies config files for tests from our config repo -->
  <Target Name="CopyTestConfigs" DependsOnTargets="CopyWebConfig">
    <Message Text="Copying test configuration files" Importance="high" />
    <Copy SourceFiles="@(TestConfigs)" DestinationFolder="$(BuildOutput)" />
    <Message Text="Finished copying test configuration files" Importance="high" />
  </Target>

  <!-- This target copies the web.config files from our config repo -->
  <Target Name="CopyWebConfig" DependsOnTargets="DeployAdmin">
    <Message Text="Copying web configuration files" Importance="high" />
    <Copy SourceFiles="$(WebConfig)" DestinationFolder="$(TempDir)" />
    <Message Text="Finished copying web configuration files" Importance="high" />
  </Target>

  <!-- This target builds and deploys the admin application to a temp folder -->
  <Target Name="DeployAdmin" DependsOnTargets="Init">
    <Message Text="Copying admin files" Importance="high" />
    <MSBuild Projects="@(ProjectsToBuild)" />
    <Message Text="Finished copying admin files" Importance="high" />
  </Target>

  <!-- This target creates the directory in which deployment files are going to be held -->
  <Target Name="Init" DependsOnTargets="Clean">
    <Message Text="Making deployment directory" Importance="high" />
    <MakeDir Directories="$(DeployDir)" />
    <Message Text="Finished making deployment directory" Importance="high" />
  </Target>

  <!-- This target removes any existing build/deploy artifacts -->
  <Target Name="Clean">
    <Message Text="Removing existing deployment directory" Importance="high" />
    <RemoveDir Directories="$(DeployDir)" />
    <Message Text="Finished removing existing deployment directory" Importance="high" />
  </Target>
</Project>

发展
任何CPU
$(MSBuildThisFileDirectory)部署$(配置)
$(DeployDir)\Build\u输出
$(部署目录)\Admin
$(部署目录)\Temp
$(MSBuildThisFileDirectory)MyApplication.sln
C:\Program Files\NUnit 2.6.3\bin\NUnit-console.exe
$(ConfigRepo)\Admin\$(配置)
$(AdminConfigLocation)\Web.config
VisualStudioVersion=$(VisualStudioVersion);
配置=$(配置);
OutputPath=$(BuildOutput);
WebPublishMethod=文件系统;
publishUrl=$(TempDir);
DeleteExistingFiles=True;
DeployOnBuild=True;
DeployTarget=WebPublish;
PublishProfile=$(MSBuildThisFileFullPath);
平台=$(构建平台)
导致问题的线路如下所示:

<Exec Command='"$(NUnitConsole)" "%(TestDlls.Identity)" /xml="@(TestResultsPath)"'

我找到了一个解决这个问题的方法,它实际上是一个更干净的解决方案。我更改了名为RunUnitTests的目标:

<!-- This target runs the unit tests and publishes the results -->
<Target Name="RunUnitTests" DependsOnTargets="CopyTestConfigs">
    <ItemGroup>
        <TestDlls Include="$(BuildOutput)\MyApplication.*.Tests.dll" />
    </ItemGroup>
    <Exec Command="&quot;$(NUnitConsole)&quot; @(TestDlls->'&quot;%(FullPath)&quot;', ' ') /xml=&quot;@(TestResultsPath)&quot;" />
</Target>

这样做的好处是,所有测试(位于不同的DLL中)都会立即传递到对NUnit的调用中,并且所有测试的结果都会输出到结果文件中。我已经在本地和我们的构建服务器上对此进行了测试,它工作正常。

我遇到了类似的问题:

  <ItemGroup>
    <NuGetPackageConfigs Include="../**/packages.config " />
  </ItemGroup>
  <Target Name="LoadNuGetPackages">
    <Message Importance="high" Text="%0ARetrieving packages for %(NuGetPackageConfigs.Identity)" />
    <PropertyGroup>
      <Comm>nuget install %(NuGetPackageConfigs.Identity) -o packages"</Comm>
    </PropertyGroup>
    <Exec Command="$(Comm)" />
  </Target>

nuget安装%(NuGetPackageConfigs.Identity)-o程序包“
当我从jenkins working dir:C:\Program Files(x86)\jenkins\jobs\project\workspace运行localy时, msbuild未解析../**/packages.config。 当我从C:\ProgramFiles(x86)\a\project运行它时,它可以工作

我改成

  <ItemGroup>
    <NuGetPackageConfigs Include="../*/*/packages.config " />
    <NuGetPackageConfigs Include="../*/packages.config " />
  </ItemGroup>


它能工作,但它不一样,仍然不知道发生了什么。

你试过在受控环境中本地运行它吗?它能工作吗?是的,我试过在jenkins的本地实例上运行它,得到了相同的结果。这是我看到的输出:
RunUnitTests:“C:\Program Files\NUnit 2.6.3\bin\NUnit-console.exe“/xml=“C:\Program Files\Jenkins\workspace\admin test\Deploy\u Dev\TestResults.xml”
您可以看到项目组没有展开,而是输出一个空字符串”“因此,当您在本地执行此操作时,在生成期间在
$(DeployDir)
中可以找到什么?我怀疑由于某种原因它没有被填充(可能,您的构建失败或将二进制文件放入其他目录-将构建详细性设置为detailed/diagnostic并检查日志)