Visual Studio链接的文件不存在

在Visual Studio中,您可以执行Add – > Existing Item ,然后从Add下拉按钮Add as Link

这很棒。 这是让你从另一个项目中添加一个文件,编辑文件也会在原始项目中编辑它。

我想使用此function在一个解决方案中的所有项目中都有一个配置文件(名为Shared.config)。 并且该文件始终相同。


|
| – 项目1
| – Shared.config [physical]
| – 项目2
| – Shared.config [链接]

发布后,文件确实在所有已发布的项目中结束,所以没有问题。

但是在发布之前(在构建开发期间),链接文件并不存在。 尝试在Windows资源管理器中查看该文件,certificate该文件不在项目目录中。 Visual Studio只使它看起来好像它存在于解决方案资源管理器中。 (虽然在构建时,链接的项目可能被复制到bin目录;但我不想使用/访问bin目录中的文件。)

现在这会让问题偏离正轨。 尝试打印出System.IO.File.ReadAllText(HttpContext.Current.Server.MapPath("Shared.config"))将在项目发布之前失败,因为在该项目中不存在Shared.config项目根目录。

我想做什么,以及我需要你的帮助的地方是:

  • 我想在ON BUILD中将所有链接文件从原始位置复制到目标位置。

这将使visual studio具有链接文件和原始副本,以存在于同一目录中的同名目录。

通常,如果该目录已包含具有相同名称的文件,则VS将不允许您在目录中创建链接项。

但是,我已经通过首先创建一个链接项来测试; 然后使用Windows资源管理器将原始文件复制到目标目录,并查看Visual Studio act ok。 解决方案资源管理器只是隐藏物理文件,并显示链接的项目。 (即使您单击解决方案资源管理Show all files中的Show all files 。)


|
| – 项目1
| – Shared.config [physical]
| – 项目2
| – Shared.config [链接]
| – Shared.config [物理,在构建期间复制到此处,对于解决方案资源管理器不可见]

这正是我想要的! 尝试编辑文件时,Visual Studio将打开“链接项”。 在构建时,物理文件将被复制到目标目录,因此它存在于尝试访问它的代码。

现在我该怎么做? 是否应该使用Build事件完成? 如果是这样,我怎么说’将所有链接文件的原件复制到目的地目录?

您应该使用MSBuildfunction来实现此function。

编辑csproj文件(在Visual Studio中,右键单击项目并卸载它。然后右键单击并编辑)

滚动到底部,你应该找到这一行。

在该行之后,立即添加这些行。

        

现在每次构建时,就在构建操作发生之前,MSBuild将复制所有链接的文件。

说明

ItemGroup包含名为“LinkedItem”的“数组”。 我通过仅添加包含link属性的“None”项来生成此数组。

Target是一个MSBuild概念。 您可以将其视为构建的特定阶段。 我将此阶段命名为“CopyLinkedFiles”,但您可以将其命名为任何名称。

BeforeTargets是一个指令,告诉MSBuild在指定阶段之前运行操作。 在这里,我选择在“构建”阶段之前运行“CopyLinkedFiles”。

Inputs是优化参数。 如果没有必要,它可以通过跳过副本来加速构建。 如果您不在乎,可以忽略此参数。 MSBuild将Inputs与预期的Outputs时间戳进行比较,以查看是否需要执行。

Copy是一个MSBuild任务,它接受要复制并输出到指定文件夹的文件。

减少冗余

您可以将其粘贴到每个.csproj文件中,或者您可以将其放在中心.proj中并将其嵌入到csproj文件中。 可悲的是,无论你做什么,你都必须至少编辑一次.csproj。 🙁

在Common项目调用中创建一个文件WhateverNameYouLike.proj将这些内容放入文件中。

       Shared.config   

现在讨厌的部分:在每个.csproj中,你必须在结束标记之前添加一行,如

我在dss539的答案中遇到了一些麻烦(在vs2010中测试过)。 首先,对于每个匹配的文件,在解决方案资源管理器中出现重复项。 其次, '%link'不是属性访问器,它是字符串本身,它总是不等于空字符串'' ,因此每个具有None构建操作的文件都在构建时匹配,复制和复制。 第三,链接文件正在复制到项目的根目录中,但我需要复制放置链接的文件。 所以我做了一些修改:

       

LinkedItem不再是解决方案资源管理器中的重复项。 要创建要复制的链接,您必须设置Content构建操作。

右键单击链接的配置文件,选择属性,将Copy to Output DirectoryNever更改为Copy always

您可以在Visual Studio中创建前置和后置构建事件。

选择项目,右键单击,属性,构建事件。

对于预建 –

 copy /y "$(LocationOfShared.Config)Shared.config\" "$(TargetDir)" 

对于后期构建

 cd $(TargetDir) del shared.config 

显然,您需要使用即将返回的实际位置,但您会明白这一点。

编辑 – 上面的答案更容易和直接,但这应该作为一个圆形的方式来做到这一点。

Interesting Posts