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 Directory
从Never
更改为Copy always
。
您可以在Visual Studio中创建前置和后置构建事件。
选择项目,右键单击,属性,构建事件。
对于预建 –
copy /y "$(LocationOfShared.Config)Shared.config\" "$(TargetDir)"
对于后期构建
cd $(TargetDir) del shared.config
显然,您需要使用即将返回的实际位置,但您会明白这一点。
编辑 – 上面的答案更容易和直接,但这应该作为一个圆形的方式来做到这一点。