默认情况下将"复制本地"设置为False?

dr *_*ain 36 copy-local visual-studio

我可以在Visual Studio中将"复制本地"的默认选项设置为False吗?在大多数情况下,当我添加一个dll作为项目的依赖项时,我希望将Copy Local属性设置为False.默认情况下,它是True.有没有办法更改Visual Studio的默认行为?(2008年)

Leo*_*rke 38

否 - Visual Studio使用一组内部规则来确定将"本地复制到"的内容.

来自MSDN:

  1. 如果引用是另一个项目,称为项目到项目引用,则该值为true.
  2. 如果在全局程序集缓存中找到程序集,则该值为false.
  3. 作为特殊情况,mscorlib.dll引用的值为false.
  4. 如果在Framework SDK文件夹中找到程序集,则该值为false.
  5. 否则,该值为true.


ya2*_*a23 27

实际上,你可以.你需要几件事:

  1. 创建默认情况下.targets使copylocal(<Private>标记,准确)为false的文件.
  2. .csproj文件中导入目标.您可以在最后一行添加它,在关闭</Project>标记之前,它看起来像<Import Project="..\Build\yourtarget.targets" />.

现在,具有此目标的每个项目都默认禁用了copylocal.

缺点是您需要修改每个csproj文件,包括新文件.您可以通过修改VS项目模板来解决新项目问题.而不是Class.cs在博客文章中描述,您需要修改Class.vstemplate(在相同的zip文件中).

通过这种方法,还有一个问题 - 路径本身.如果在新生成的csproj文件中使用硬编码相对路径,则它们可能是错误的(除非您具有平面项目结构).

您可以:

  • 使VS生成正确的相对路径.不知道如何做到这一点,如果这是可能的.
  • 忽略它并为每个新的csproj手动更改路径(取决于您拥有的新项目的数量,虽然不理想,但这可能是可以容忍的).
  • 使用环境变量而不是相对路径.在这种情况下,每个开发人员都需要相同的变量集.

必须有更好的解决方案,但还没有找到.


her*_*ube 7

我们不使用.targets文件(如ya23的回答中所示),因此我们只需.csproj在文本编辑器中手动编辑项目文件,并将<Private>元素添加到引用中,如下所示:

<Reference Include="[...]">
  <Private>False</Private>
  [...]
</Reference>
Run Code Online (Sandbox Code Playgroud)

该值<Private>元素中的"复制本地"属性的值相匹配.例如,如果<Private>设置为False,则"Copy local"也为false.


gRe*_*ReX 6

从msbuild v 15开始,您可以在包含您的源的根文件夹中复制一个名为Directory.Build.props的文件:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemDefinitionGroup>
  <Reference>
    <Private>False</Private>
  </Reference>
  <ProjectReference>
     <Private>False</Private>
  </ProjectReference>
</ItemDefinitionGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

没事做!这与Visual Studio 2017以及vNext Build一起很好地工作。可能您必须关闭Visual Studio,然后再打开解决方案才能使文件生效。

https://docs.microsoft.com/zh-cn/visualstudio/msbuild/customize-your-build#directorybuildprops-and-directorybuildtargets