从Output TaskParameter获取程序集项目文件名

Jür*_*ock 8 .net c# msbuild

msbuild.exe用来从命令行自动化我的构建.

我执行以下步骤.

  • 将项目编译到项目目录外的文件夹中
  • 压缩每个编译的项目

这是我的目标

第一个编译

<Target Name="BuildProjects"  DependsOnTargets="BeforeBuild">

    <ItemGroup>      
  <BuildProjectFiles Include="**\MyCompany.Project1\MyCompany.Project1.csproj" />
  <BuildProjectFiles Include="**\MyCompany.Project2\MyCompany.Project2.csproj" />
  <BuildProjectFiles Include="**\MyCompany.Project2\MyCompany.Project2-CE.csproj" />
      ... and some more
    </ItemGroup>

    <MSBuild Projects="@(BuildProjectFiles)" Properties="AllowUnsafeBlocks=true;Configuration=$(Configuration);OutputPath=$(MSBuildProjectDirectory)\Deploy\bin\%(BuildProjectFiles.FileName)">
        <Output TaskParameter="TargetOutputs"
                ItemName="BuildProjectsOutputFiles" />
    </MSBuild>

</Target>
Run Code Online (Sandbox Code Playgroud)

现在是将每个已编译项目压缩到其一个文件的目标.

<Target Name="ZipProjects" DependsOnTargets="BuildProjects">

    <CreateItem
        Include="@(BuildProjectOutputFiles)"
            AdditionalMetadata="AssemblyName=%(Filename);ProjectName=%(RelativeDir)">
        <Output TaskParameter="Include" ItemName="BuildProjectsOutputFiles123"/>
    </CreateItem>

    <CreateItem Include="%(BuildProjectsOutputFiles123.RelativeDir)*" AdditionalMetadata="OutputFileName=$(MSBuildProjectDirectory)\Deploy\dist\$(Configuration)\%(BuildProjectsOutputFiles123.AssemblyName)-$(MajorNumber).$(MinorNumber).$(ReleaseNumber).zip;WorkingDirectory=%(BuildProjectsOutputFiles123.RelativeDir)">
        <Output TaskParameter="Include" ItemName="BuildProjectsOutputFiles456"/>
    </CreateItem>

    <Zip Files="@(BuildProjectsOutputFiles456)"
        WorkingDirectory="%(BuildProjectsOutputFiles456.WorkingDirectory)" 
        ZipFileName="%(BuildProjectOutputFiles456.OutputFileName)"  />
        <!-- ZipLevel="9"/> -->

</Target>
Run Code Online (Sandbox Code Playgroud)

所以会发生的是我指定的每个项目BuildProjectFiles都被编译到文件夹中<rootdir>\deploy\bin\<name of the csproj file without extension\

在第二步中,我使用MSBuild.Community.TasksZip-Task压缩每个项目并将其复制到<rootdir>\deploy\dist\release\<assemblyname>-<version>.zip

所以基本上程序集project1.exe及其依赖项project1-2.4.7.zip在执行msbuild后都在文件中.

这非常有效.但现在我有一个改变,我无法弄清楚如何解决.我有两个具有相同程序集名称的程序集(一个用于Windows,另一个用于Windows CE),因此第一个项目编译并创建一个文件夹project2-2.4.7.zip,然后下一个项目编译并覆盖zip文件.

现在我希望Zip-File以文件命名.csproj(如bin文件夹).因为我的一个项目文件被调用mycompany.project2.csproj而另一个项目文件mycompany.project2-ce.csproj我应该没问题.

简而言之:如何将项目名称传递给zip目标?

Ans*_*sss 1

这个合适吗?$(MSBuild项目名称)

MSBuild 保留属性