【问题标题】:Add File as a Link on Visual Studio - Debug vs Publish在 Visual Studio 上添加文件作为链接 - 调试与发布
【发布时间】:2013-09-28 14:45:33
【问题描述】:

每次我必须将一个文件作为链接链接到一个 ASP.NET 项目中时,总会有一些我忘记做的事情,因为 Visual Studio 的错误太多,而且对这些很烦人。 它存在一个错误/限制,因此它不会将文件复制到 Debug 输出文件夹中,我们必须更改文件的属性以便它也被复制到 Publish 输出文件夹中。

经过大量研究,我以艰难的方式学会了这一点,并创建了一个 AfterBuild 目标来帮助简化此过程。但是,在添加文件时仍然需要做一些手动工作。

这是我维护的一个项目的示例。假设我们要在 ASP.NET 项目的“utilities”文件夹中添加文件 YIUCARD。

1) 右键单击​​ Visual Studio 上的“utilities”文件夹,然后选择“Add -> Existing item”。

2) 选择要添加的文件,单击一次(不要双击)。

3) 单击“添加”按钮旁边的箭头并选择“添加为链接”。

目前,这将无济于事。该文件不会被复制到任何文件夹(调试和发布)。它只是添加到项目中。

4) 右键单击​​文件并打开属性。

5) 改变: “构建行动”到“内容” “复制到输出目录”改为“始终复制”

此时,文件将被复制到发布输出文件夹(我们在发布时定义的任何位置)。 但是,当我们在本地调试时(F5),它不会工作,因为该文件没有复制到代码库的本地“实用程序”文件夹中。

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 中重新加载。

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

但是,我想知道是否有任何更简单/直观的方法可以做到这一点。

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

请查看以下相关问题:

Parser Error Message: Could not load type 'TestMvcApplication.MvcApplication'

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

此问题是否已在较新版本的 Visual Studio 中得到修复/改进?

【问题讨论】:

    标签: c# asp.net visual-studio


    【解决方案1】:

    MSBuild.WebApplication.CopyContentLinkedFiles NuGet 可能会对您有所帮助。这个包添加了一个 MSBuild 目标,它将在构建过程中作为链接添加的所有内容文件复制到 Web 应用程序文件夹。

    【讨论】:

    • 是的 - 我遇到了同样的问题,“添加为链接”css 文件出现 404 个错误(不要问为什么 - 1 个 sln、3 个 Web 项目、4 个相同的 css 文件)和这个 nuget包解决了这个问题,只是花花公子。
    • 天哪,非常感谢,这是公认的答案。
    【解决方案2】:

    如果目标是包含内容文件夹(例如脚本、图像),则不应管理单个文件。相反,将这些文件夹包含在您的构建和发布文件中。

    当需要添加/删除文件时,只需在内容文件夹中更新它们即可。这本质上就是我们处理帮助文件的方式,因为它们不是由开发人员管理的。

    查看这些链接:

    Is there a way to automatically include content files into asp.net project file?

    ASP.NET Web Deployment using Visual Studio: Deploying Extra Files

    【讨论】:

    • 嗨,基思。这不是我要描述的问题,但无论如何感谢您的提示:)
    【解决方案3】:

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

    【讨论】:

    • 假设您的意思是在操作系统级别添加符号链接,我同意这将允许人们从 VS 中的任一项目(或任何编辑器,但 OP 专门询问 VS)编辑文件,但是,它是,IMO,使用大锤在图钉中驱动。再说一次,它不需要编辑每个链接文件的属性来告诉 build 复制它们,并且不需要另一个 NuGet 包。但是,如果您使用构建服务器,那么您也必须在那里设置符号链接,但您可能没有权限并且管理员可能不想这样做。
    猜你喜欢
    • 1970-01-01
    • 2012-12-01
    • 2011-03-09
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多