我有一个C#项目,它使用sln文件中的Project Dependencies来确保构建顺序正确.
所以我在我的sln文件中,ProjectB依赖于ProjectA.
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProjectB","ProjectB.csproj","{E24EAC46-1563-4E73-9411-3F9D2645F77C}" ProjectSection(ProjectDependencies) = postProject {4A7D6720-4AA1-4F0B-A796-A0436DB3D7D7} = {4A7D6720-4AA1-4F0B-A796-A0436DB3D7D7} EndProjectSection EndProject
ProjectA有一些设置为CopyIfNewer的内容.
当我使用Visual Studio构建它时,ProjectA转到它自己的bin文件夹,ProjectB转到它自己的bin文件夹.
但是当我使用MSBuild构建它时,ProjectA的内容也会以某种方式出现在ProjectB的输出文件夹中!
构建日志显示[ProjectB.csproj] _CopyOutOfDateSourceItemsToOutputDirectory复制文件.
我的问题是:我如何告诉MSBuild文件不属于该项目而不必复制?
作为一种解决方法,我将ProjectA添加为ProjectReference,其中< Private> False< / Private>这似乎有效,但这不是我想要的解决方案.
解决方法
我解决了在ProjectB .csproj文件中覆盖MSBuild任务的麻烦.
(我只在.sln文件中依赖ProjectA,而不是将项目作为ProjectReference添加到ProjectB)
(我只在.sln文件中依赖ProjectA,而不是将项目作为ProjectReference添加到ProjectB)
<Project> ..... <Target Name="_CopyOutOfDateSourceItemsToOutputDirectory" Condition=" '@(_SourceItemsToCopyToOutputDirectory)' != '' " Inputs="@(_SourceItemsToCopyToOutputDirectory)" Outputs="@(_SourceItemsToCopyToOutputDirectory->'$(OutDir)%(TargetPath)')"> <Message Importance="Normal" Text="$(MSBuildProjectName) Skip copy _CopyOutOfDateSourceItemsToOutputDirectory" /> </Target> <Target Name="_CopyOutOfDateSourceItemsToOutputDirectoryAlways" Condition=" '@(_SourceItemsToCopyToOutputDirectoryAlways)' != '' "> <Message Importance="Normal" Text="$(MSBuildProjectName) Skip copy _CopyOutOfDateSourceItemsToOutputDirectoryAlways" /> </Target> </Project>
对于我自己的文件,需要复制到输出目录我是通过postbuild中的XCOPY来做的,如:
<PropertyGroup> <PostBuildEvent>xcopy "$(ProjectDir)SomeSubFolder\SomeContentFile.cfs" "$(TargetDir)SomeSubFolder\" /Y /F</PostBuildEvent> </PropertyGroup>
也许有超越_CopyOutOfDateSourceItemsToOutputDirectory *任务like this的智能变体.但我的变体现在让我满意.因为我的项目中没有其他内容文件的依赖项.