2

我们在 csproj 中工作,提交、更新和删除文件。有时 csproj 在 subversion 存储库中提交,但其内容引用的文件不再存在于磁盘中。

我正在考虑创建一个单元测试来检查引用的内容文件是否真的存在于磁盘中,例如:

\Styles\main.css - PASSED
\Styles\main.ie7.css - FAILED -> it does not exist in disk
\Styles\main.ie8.css - PASSED

是否有 C# 示例、任何免费工具或批处理文件可以完成这项工作?

4

3 回答 3

3

我创建了一个单元测试来检查文件。这可以放在持续集成服务器中以检查硬盘驱动器中是否存在文件。希望这可以帮助在开发团队工作时面临同样问题的人:

此示例在位于的文件中运行测试D:\YourProject\Solution\My.Website

在您的测试项目中处理文件 IO 的助手(假设它是 on D:\YourProject\Solution\My.Website.Tests

internal sealed class IOHelper
{
    /// <summary>
    /// get list of files described in csproj
    /// </summary>
    /// <param name="filename"></param>
    /// <returns></returns>
    public static List<string> GetFilesInCSPROJ(string filename)
    {
        var list = new List<string>();
        var lines = File.ReadLines(filename);
        foreach (string line in lines)
        {
            if (line.Contains("<Content Include="))
                list.Add(Regex.Matches(line, "(?:[^\"]+|\\.)*")[2].Value);

        }
        return list;

    }
}

在您的测试项目中(假设它是 on D:\YourProject\Solution\My.Website.Tests

/// <summary>
/// Tests for CSPROJ
/// </summary>
[TestClass]
public class TestCSPROJ
{

    /// <summary>
    /// check if CSPROJ content files exist in disk
    /// </summary>
    [TestMethod]
    public void CsProj_Files_Exist_In_Disk()
    {
        string root = Environment.CurrentDirectory.Substring(0, Environment.CurrentDirectory.IndexOf("\\Solution\\TestResults"))
            + "\\Website\\My.Website\\";
        string websiteProj = root + "My.Website.csproj";
        var list = IOHelper.GetFilesInCSPROJ(websiteProj);
        Assert.IsTrue(list != null, "there are no content files added in Portal6.Website.csproj");
        foreach (var item in list)
        {
            Assert.IsTrue(System.IO.File.Exists(root + item), "FAILED - file not found in disk: " + root + item);
        }

    }
}
于 2012-08-03T18:36:36.397 回答
2

这是一个 MsBuild 解决方案:http: //www.neovolve.com/2013/01/11/causing-a-vs-web-project-to-fail-compilation-when-content-is-missing/

我改进了此解决方案,以添加对 Build Action 设置为 Embedded Resource 的文件以及具有 Content 的文件的检查:

<Target Name="BeforeBuild">
  <ItemGroup>
    <MissingContentFiles Include="@(Content)" Condition="!Exists(%(Content.FullPath))" />
    <MissingResourceFiles Include="@(EmbeddedResource)" Condition="!Exists(%(EmbeddedResource.FullPath))" />
  </ItemGroup>

  <Message Text="Content file: %(Content.FullPath)" />
  <Message Text="Missing content file: %(MissingContentFiles.FullPath)" Condition="'@(MissingContentFiles)' != ''" />
  <Error Text="Content file '%(MissingContentFiles.FullPath)' was not found." Condition="'@(MissingContentFiles)' != ''" ContinueOnError="true" />
  <Error Text="One or more content files are missing." Condition="'@(MissingContentFiles)' != ''" />

  <Message Text="Embedded resource: %(EmbeddedResource.FullPath)" />
  <Message Text="Missing embedded resource: %(MissingResourceFiles.FullPath)" Condition="'@(MissingResourceFiles)' != ''" />
  <Error Text="Embedded resource file '%(MissingResourceFiles.FullPath)' was not found." Condition="'@(MissingResourceFiles)' != ''" ContinueOnError="true" />
  <Error Text="One or more embedded resource files are missing." Condition="'@(MissingResourceFiles)' != ''" />
</Target>
于 2015-12-14T22:46:31.007 回答
1

如果缺少源文件,您的项目不太可能构建。

如果您想阻止签入*.csproj文件,除非相关的源文件已存在于源代码管理中,您可能希望在源代码管理系统中编写一个触发器,该触发器将检查该*.csproj文件并验证其所有相关源文件是否存在于源代码控制,如果不满足约束,则拒绝签入。

当然,您将遇到用户添加了新源文件并*.csproj在同一个原子签入中同时签入新源文件和更新文件的极端情况。

做任何此类事情都高度依赖于使用的源代码控制系统。

于 2012-08-03T16:51:27.523 回答