在Visual Studio中将文件添加为链接 - 调试与发布的区别

50
每次我在ASP.NET项目中链接一个文件时,总会有一些事情我忘记做,这是因为Visual Studio对此非常有bug并且很恼人。它存在一个错误/限制,导致它不会将文件复制到Debug输出文件夹中,我们必须更改文件的属性,以便将其复制到发布输出文件夹中。
我通过很多研究才学会了这个方法,并创建了一个AfterBuild目标来帮助简化此过程。然而,在添加文件时仍需要一些手动工作。
以下是我维护的一个项目的示例。假设我们要将文件YIUCARD添加到ASP.NET项目的“utilities”文件夹中。
1)右键单击Visual Studio中的“utilities”文件夹,选择“添加->现有项目”。
2)选择要添加的文件,单击一次(不要双击)。
3)单击“添加”按钮旁边的箭头,选择“链接添加”。
此时,这将无效。该文件将不会复制到任何文件夹(Debug和Publish)。 它只是被添加到项目中。
4)右键单击文件并打开“属性”。
5)更改:“生成操作”为“内容”,“复制到输出目录”为“始终复制”。
此时,该文件将复制到发布输出文件夹中(在发布时定义的任何位置)。然而,当我们在本地调试(F5)时,它不起作用,因为该文件未复制到代码库上的本地“utilities”文件夹中。
6)通过选择“全部保存”在Visual Studio上保存更改。这样,“.csproj”文件才会被保存,因为我们对它进行了更改,现在将手动编辑它。
7)在Notepad++中打开“.csproj”。
8)将文件添加到“BeforeBuild”事件中(这是我的)。
 <Target Name="BeforeBuild">
    <ItemGroup>
      <UtilitiesFiles Include="..\path\to\file\REDOPXX.NEW" />
      <UtilitiesFiles Include="..\path\to\file\REDFMTST" />
      <UtilitiesFiles Include="..\path\to\file\JOBCARD" />
      <UtilitiesFiles Include="..\path\to\file\YIUCARD" />
    </ItemGroup>
    <Copy SourceFiles="@(UtilitiesFiles)" DestinationFolder=".\utilities" SkipUnchangedFiles="true" />
  </Target>

9)我有一个 “AfterBuild” 事件用于发布模式,在此模式下自动将项目发布,以便文件直接到达我想要的输出文件夹:

  <Target Name="AfterBuild" Condition=" '$(Configuration)' == 'Release' ">
    <PropertyGroup>
      <OutputDir>..\path\to\publish\MyProject</OutputDir>
    </PropertyGroup>
    <Message Importance="High" Text="Output DIR: $(OutputDir)" />
    <RemoveDir Directories="$(OutputDir)" ContinueOnError="true" />
    <MSBuild Projects="MyProject.csproj" Properties="Configuration=$(Configuration);WebProjectOutputDir=$(OutputDir);OutDir=$(OutputDir)bin\" Targets="ResolveReferences;_CopyWebApplication" />
  </Target>

10) 在Notepad++中保存文件,然后在Visual Studio上重新加载它。

Step 10

构建项目时,该文件将被复制到Debug和Release/Publish文件夹中!

然而,我想知道是否有更简单/直观的方法来做到这一点。

你可能会说,通过将Debug输出文件夹更改为与Release/Publish文件夹相同,可以解决此问题,以便在第一次发布后文件会出现在那里。 但是,请注意,这也存在一个错误。如果我使用除“bin\”以外的输出文件夹,aspx文件将抱怨找不到程序集。即使我将“复制到输出目录”设置为“始终复制”,它也会抱怨找不到“Global.asax.cs”。

请参阅以下相关问题:

解析器错误消息:无法加载类型 'TestMvcApplication.MvcApplication'

"Could not load type [Namespace].Global" causing me grief

在Visual Studio的新版本中是否已经修复或改进了这个问题?

3个回答

18

MSBuild.WebApplication.CopyContentLinkedFiles NuGet 可能会对您有所帮助。此软件包添加了一个 MSBuild 目标,用于在构建期间将所有作为链接添加到 Web 应用程序文件夹的内容文件复制到相应位置。


1
是的 - 我也遇到了同样的问题,对于一个“添加为链接”的CSS文件出现了404错误(不要问为什么 - 1个sln,3个Web项目,4个相同的CSS文件),而这个NuGet包解决了这个问题。 - Greg Trevellick
太神了,非常感谢,这是最佳答案。 - Nick Kovalsky
我寻找这个已经多年了,却没有意识到它的存在。谢谢! - Nick Van Brunt

0

我认为最好的方法之一是按照您的意愿创建符号链接。 这将有助于您管理始终必须相同的文件。


假设您的意思是在操作系统级别添加符号链接,我同意这样可以让您在VS(或任何编辑器,但OP专门询问VS)中从两个项目中的任一项目编辑文件。然而,在我看来,这就像用大锤来打小钉子一样过度了。不过,它不需要编辑每个链接文件的属性来告诉构建将它们复制,并且不需要另一个NuGet程序包。但是,如果您使用构建服务器,则还必须在那里设置符号链接,但您可能没有权限,管理员也可能不想这样做。 - Andrew Steitz

0
如果目标是包含内容文件夹(例如脚本、图像),则不应管理单个文件。相反,应将这些文件夹包含在构建和发布文件中。
当需要添加/删除文件时,只需在内容文件夹中更新它们。这基本上是我们处理帮助文件的方式,因为它们不是由开发人员管理的。
请查看以下链接: 有没有一种自动将内容文件包含到asp.net项目文件中的方法? 使用Visual Studio进行ASP.NET Web部署:部署额外文件

嗨,Keith。那不是我描述的问题,但无论如何感谢你的提示 :) - Nuno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接