MSBuild:将项目引用更改为文件二进制引用

时间:2011-12-05 21:24:06

标签: visual-studio-2010 xpath ant msbuild xmltask

我正在使用MSBuild构建一些.net / C#项目。

在我正在构建的项目中,有一些项目引用其他C#项目。

我只是在构建单个项目,因此我想在构建期间将项目引用重新指向文件夹中的实际二进制文件。

我已经为我的MSBuild步骤将“BuildProjectReferences”设置为False。

基本上我想让MSBuild忽略项目引用并在新目录中查找这些二进制文件。

这可能吗?是否可以在构建之前不必动态修改项目文件?

**更新1 **

更多信息可能会有所帮助......我实际上是通过Ant / AntDotNet / MSBuild构建每个二进制文件并上传到Artifactory。我基本上使用Ivy的依赖管理和.Net二进制文件。

现在我上传和下载依赖项工作正常。

我唯一缺少的部分是让MSBuild将二进制文件作为文件依赖项而不是它在项目文件中的项目引用来查找。

**更新2 **

看起来MSBuild支持使用XMLPoke和XMLPeek编辑csproj文件。

所以在我的情况下,我需要在项目文件中更改以下内容:

<ProjectReference Include="..\MyReferencedProject\MyReferencedProject.csproj">
  <Project>{MyReferencedProjectGUID}</Project>
  <Name>MyReferencedProject</Name>
  <Private>False</Private>
</ProjectReference>

到这个

<Reference Include="MyReferencedProject">
</Reference>

任何人都可以给我任何指示吗?

2 个答案:

答案 0 :(得分:0)

在Update2上回答: 您的问题与this question相关/重复。没有简单的方法来转换它。您应该为它编写MSBuild自定义任务,以便在构建之前更新MSBuild项目文件。

答案 1 :(得分:0)

我最终将Ant与xmltask插件结合使用。

<target name="convert" description="convert project references to file references">
    <echo>Converting the following Project references :: ${Project.ItemGroup.ProjectReference.Name}</echo>
    <xmltask source="MyParentProject.csproj" dest="MyParentProject.csproj">
        <rename path="/:Project/:ItemGroup/:ProjectReference/:Name" to="BinaryName"/>
    </xmltask>
    <replace file="MyParentProject.csproj" token="&lt;BinaryName&gt;" value="&lt;Reference Include=&quot;"/>
    <replace file="MyParentProject.csproj" token="&lt;/BinaryName&gt;" value="&quot;&gt;&lt;/Reference&gt;"/>
    <xmltask source="MyParentProject.csproj" dest="MyParentProject.csproj">
        <copy path="/:Project/:ItemGroup/:ProjectReference/:Reference" buffer="refbuffer" append="true"/>
        <paste path="/:Project/:ItemGroup[1]" buffer="refbuffer"/>
        <remove path="/:Project/:ItemGroup/:ProjectReference" /> 
    </xmltask>
    <echo>Conversion complete.</echo>
</target>

在第一个xmltask中,我们将“Name”元素设置为“BinaryName”,以便我们可以找到它。

接下来,我们有两个Ant替换任务,改变了类似

的内容
"<BinaryName>MyReferencedProject</BinaryName>" 

"<Reference Include="MyReferencedProject"></Reference>"

在最后一个xmltask中移动我们的项目引用,我们将文件引用转换为通常具有文件引用的上部ItemGroup。

最后我们删除了ProjectReferences部分。